Android中的SQLite Query可以计算行数

aru*_*run 91 sqlite android count

我正在尝试创建一个简单的登录表单,我将登录屏幕上输入的登录ID和密码与存储在数据库中的登录ID和密码进行比较.

我正在使用以下查询:

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

问题是,我不知道,我如何执行上述查询并存储返回的计数.

这是数据库表的样子(我已经使用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);";
Run Code Online (Sandbox Code Playgroud)

有人可以指导我如何实现这一目标吗?如果可能,请提供一个示例代码段来执行上述任务.

sco*_*yab 120

DatabaseUtils.queryNumEntries(因为api:11)是一个有用的替代方案,可以消除对原始SQL的需求(耶!).

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

  • @Khobaib检查ghchinoy的答案 (2认同)

小智 112

@scottyab参数化的DatabaseUtils.queryNumEntries(db,table,whereparams)存在于API 11 +中,自API 1以来不存在whereparams的那个.答案必须是使用db.rawQuery创建一个Cursor:

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

我也喜欢@ Dre的答案,参数化查询.


Tek*_*ebo 62

使用SQLiteStatement.

例如

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

  long count = s.simpleQueryForLong();
Run Code Online (Sandbox Code Playgroud)


Dre*_*Dre 22

请参阅rawQuery(String,String [])Cursor的文档

你DADABASE_COMPARE SQL语句是当前无效,loginnameloginpass不会被转义,之间不存在空间loginnameand,你最终该发言); 代替 ; - 如果您使用密码密码登录为bob,则该语句最终将为

select count(*) from users where uname=boband pwd=password);
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用selectionArgs功能,而不是连接loginname和loginpass.

要使用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 });
    ...
}
Run Code Online (Sandbox Code Playgroud)


Elo*_*rro 22

假设您已经db建立了Database()连接,我认为最优雅的方法是坚持使用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;
Run Code Online (Sandbox Code Playgroud)

  • 您至少应该指定一列.传递null将返回所有列,不鼓励这些列阻止从不会使用的存储中读取数据.#perfmatters (2认同)

kon*_*ity 12

如何获得计数列

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

int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);
Run Code Online (Sandbox Code Playgroud)

这是最简洁和精确的替代方案.无需处理游标及其关闭.


Bes*_*yez 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);
Run Code Online (Sandbox Code Playgroud)


Chi*_*rag 5

如果要获取记录数,则必须在某些字段上应用组或应用以下查询.

喜欢

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


Joc*_*sel 5

另一种方式是使用:

myCursor.getCount();
Run Code Online (Sandbox Code Playgroud)

在光标上:

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

如果你能想到远离原始查询.