행을 계산하는 Android의 SQLite 쿼리


91

로그인 화면에서 입력 한 로그인 ID와 비밀번호를 데이터베이스에 저장된 것과 비교하는 간단한 로그인 양식을 만들려고합니다.

다음 쿼리를 사용하고 있습니다.

final String DATABASE_COMPARE =
"select count(*) from users where uname=" + loginname + "and pwd=" + loginpass + ");" ;

문제는 어떻게 위의 쿼리를 실행하고 반환 된 개수를 저장할 수 있는지 모르겠습니다.

다음은 데이터베이스 테이블의 모습입니다 (execSQl 메서드를 사용하여 데이터베이스를 성공적으로 만들도록 관리했습니다).

private static final String
DATABASE_CREATE =
            "create table users (_id integer autoincrement, "
            + "name text not null, uname primary key text not null, " 
            + "pwd text not null);";//+"phoneno text not null);";

누군가 내가 이것을 어떻게 할 수 있는지 친절하게 안내해 줄 수 있습니까? 가능하면 위의 작업을 수행하기 위해 샘플 스 니펫을 제공하십시오.

답변:


121

DatabaseUtils.queryNumEntries (api : 11 이후)는 원시 SQL (yay!)의 필요성을 없애주는 유용한 대안입니다.

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});

OS <11의 경우 NoSuchMethodError 오류가 발생합니다. OS <11을 지원하는 해결 방법이 있습니까?
Khobaib 2013

2
ghchinoy에서 답을 확인 @Khobaib
에두아르도 HERZER에게

1
@EduardoHerzer 저는 cursor.getCount () 직접 방법을 찾았습니다.
Khobaib

1
@Khobaib 그것은 그것을하는 매우 효율적인 방법이 아닙니다. 당신은 항상 모든 레코드를 사용 SELECT COUNT(*)하고 queryNumEntries()검색 하는 것을 선호 하고 얼마나 많은 레코드가 있는지 확인해야합니다. cursor.getCount()
DearVolt

114

@scottyab 매개 변수화 된 DatabaseUtils.queryNumEntries (db, table, whereparams) 는 API 11 +에 존재하며 whereparams가없는 것은 API 1 이후 존재합니다 . 대답은 db.rawQuery를 사용하여 커서를 만들어야합니다.

Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null);
mCount.moveToFirst();
int count= mCount.getInt(0);
mCount.close();

매개 변수가있는 쿼리를 사용하는 @Dre의 답변도 마음에 듭니다.


1
궁금한 사람들을 위해 매개 변수는 mCount.getInt()입니다 columnindex. 도와 줘서 고마워!
T.Woody

62

SQLiteStatement를 사용하십시오 .

예 :

 SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );

  long count = s.simpleQueryForLong();

1
이 답변과 @scottyab의 답변 (정말 좋은)에 대해 내가 좋아하는 한 가지는이 경우 LIMIT 절을 지정할 수 있다는 것입니다. 이것은 테이블에 행이 있는지 (예 : TABLE LIMIT 1에서 (count (*)> 0) 선택) 대 행이 없는지 알고 싶을 때 유용합니다. 나는 테이블에 행이 없거나 많은 행이 없을 때 더 빠를 것이라고 생각합니다. 이것은 내가 이것을 검색 할 때 가졌던 특정한 경우입니다 ...
stuckj

@Teknogrebo : 매개 변수화 된 버전을 사용하지만 이것은 좋은 대답입니다. 당신이 사용할 수있는 ?사용 후 쿼리들과 bindString(int, String)하고 bindLong(int, long)값을 삽입 할 수 있습니다. 를 참조하십시오 여기 .
DearVolt

22

rawQuery (String, String [])Cursor 설명서를 참조하십시오.

귀하의 DADABASE_COMPARE SQL 문이 현재 유효하지 않습니다, loginname그리고 loginpass이스케이프되지 않습니다,이 사이에 공간이 없다 loginname하고는 and), 그리고 당신과 함께 문을 종료; 대신에 ; -암호의 암호를 사용하여 bob으로 로그인 한 경우 해당 문은 다음과 같이 끝납니다.

select count(*) from users where uname=boband pwd=password);

또한 loginname과 loginpass를 연결하는 대신 selectionArgs 기능을 사용해야합니다.

selectionArgs를 사용하려면 다음과 같이하십시오.

final String SQL_STATEMENT = "SELECT COUNT(*) FROM users WHERE uname=? AND pwd=?";

private void someMethod() {
    Cursor c = db.rawQuery(SQL_STATEMENT, new String[] { loginname, loginpass });
    ...
}

22

이미 Database ( db) 연결이 설정되어 있다고 가정하면 가장 우아한 방법은 Cursor클래스 를 고수하고 다음과 같이하는 것입니다.

String selection = "uname = ? AND pwd = ?";
String[] selectionArgs = {loginname, loginpass};
String tableName = "YourTable";
Cursor c = db.query(tableName, null, selection, selectionArgs, null, null, null);
int result = c.getCount();
c.close();
return result;

2
최소한 열을 지정해야합니다. null을 전달하면 모든 열이 반환되므로 사용하지 않을 저장소에서 데이터를 읽지 않도록하는 것이 좋습니다. #perfmatters
redochka

실제로 필요한 정보 만 수, 하나의 열 (예를 들어 ID)를 검색하는 더 충분 될 경우
엘리 바로

12

카운트 열을 얻는 방법

final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;

int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);

이것은 가장 간결하고 정확한 대안입니다. 커서와 닫기를 처리 할 필요가 없습니다.


놀랍습니다-Android와 영원히 협력 해
왔으며이

6

ContentProvider를 사용하는 경우 다음을 사용할 수 있습니다.

Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
            uname=" + loginname + " and pwd=" + loginpass, null, null);
    cursor.moveToFirst();
    int count = cursor.getInt(0);

5

또 다른 방법은 다음을 사용하는 것입니다.

myCursor.getCount();

다음과 같은 커서에

Cursor myCursor = db.query(table_Name, new String[] { row_Username }, 
row_Username + " =? AND " + row_Password + " =?",
new String[] { entered_Password, entered_Password }, 
null, null, null);

원시 쿼리에서 벗어나는 것을 생각할 수 있다면.


5

레코드 수를 얻으려면 일부 필드에 그룹을 적용하거나 아래 쿼리를 적용해야합니다.

처럼

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);

1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.