Android中的SQLite查询对行进行计数


91

我试图创建一个简单的Login表单,将登录屏幕上输入的登录ID和密码与数据库中存储的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);";

有人可以指导我如何实现这一目标吗?如果可能,请提供示例代码以完成上述任务。

Answers:


121

DatabaseUtils.queryNumEntries(自api:11起)是有用的替代方法,它消除了对原始SQL的需求(是的!)。

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

对于OS <11,它会出现NoSuchMethodError错误,是否有支持OS <11的解决方法?
霍拜卜

2
@Khobaib检查ghchinoy的答案
Eduardo Herzer

1
@EduardoHerzer我直接用cursor.getCount()找到了一种方法。
霍拜卜

1
@Khobaib这不是一个非常有效的方法。您应该始终喜欢使用SELECT COUNT(*)queryNumEntries()检索所有记录,而不要查看有多少记录,即。cursor.getCount()
DearVolt

114

@scottyab的参数化DatabaseUtils.queryNumEntries(db,table,whereparams)存在于API 11+,自API 1起就存在没有whereparams的参数。答案必须是使用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
对于那些想知道的人,for的参数mCount.getInt()columnindex。感谢您的帮助!
T.Woody '18年

62

使用一个SQLiteStatement

例如

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

  long count = s.simpleQueryForLong();

1
我喜欢这个答案与@scottyab的答案(这也非常好)的一件事是,在这种情况下,您可以指定LIMIT子句。当您只想知道表中是否有任何行(例如,从表限制1中选择(count(*)> 0))而不是行时,这很有用。我猜这将在表可能没有行或一排行的情况下更快。这是我在搜索此内容时遇到的特殊情况...
stickj 16/09/29

@Teknogrebo:这是一个很好的答案,尽管我会使用参数化版本。您可以?在查询中使用s,然后使用bindString(int, String)bindLong(int, long)插入值。看这里
DearVolt

22

rawQuery(字符串,字符串[])和用于文档光标

您的DADABASE_COMPARE SQL语句当前无效,loginname并且loginpass不会被转义,loginname和之间没有空格and,并且您以)结尾该语句;代替 ; -如果您使用密码为bob的密码登录,该语句将最终显示为

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

另外,您可能应该使用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

假设您已经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;

2
您至少应指定一列。传递null将返回所有列,不建议这样做,以防止从不会使用的存储中读取数据。#perfmatters
redochka

实际上,如果仅提供必要的信息,那么检索单个列(例如ID)就绰绰有余
Eloi Navarro

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合作,从不了解DatabaseUtils-Google应该会更好地推广该实用程序...
老虎机

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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.