Android中的SQLite查询来计算行数
Posted
技术标签:
【中文标题】Android中的SQLite查询来计算行数【英文标题】:SQLite Query in Android to count rows 【发布时间】:2011-07-09 07:19:40 【问题描述】:我正在尝试创建一个简单的登录表单,我将在登录屏幕上输入的登录 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);";
有人可以指导我如何实现这一目标吗?如果可能,请提供一个示例 sn-p 来完成上述任务。
【问题讨论】:
【参考方案1】:DatabaseUtils.queryNumEntries(从 api:11 开始)是一个有用的替代方案,它不需要原始 SQL(耶!)。
SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
"uname=? AND pwd=?", new String[] loginname,loginpass);
【讨论】:
对于 OS @Khobaib 检查来自 ghchinoy 的答案 @EduardoHerzer 我找到了一种直接使用 cursor.getCount() 的方法。 @Khobaib 这不是一种非常有效的方法。您应该始终更喜欢使用SELECT COUNT(*)
和queryNumEntries()
,而不是检索所有记录并查看有多少记录,即。 cursor.getCount()
【参考方案2】:
@scottyab 参数化 DatabaseUtils.queryNumEntries(db, table, whereparams) 存在于 API 11 +,即 without the whereparams exists since 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 的答案,带有参数化查询。
【讨论】:
对于那些想知道的人,mCount.getInt()
的参数是columnindex
。感谢您的帮助!【参考方案3】:
使用SQLiteStatement。
例如
SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );
long count = s.simpleQueryForLong();
【讨论】:
我喜欢这个答案与@scottyab 的答案(这也非常好)的一点是,在这种情况下,您可以指定一个 LIMIT 子句。当您只想知道表中是否有任何行(例如,从 TABLE LIMIT 1 中选择 (count(*) > 0))而不是没有行时,这很有用。我猜当表格可能没有行或有大量行时,这会更快。这是我在搜索时遇到的具体情况...... @Teknogrebo:这是一个不错的答案,尽管我会使用参数化版本。您可以在查询中使用?
s,然后使用bindString(int, String)
和bindLong(int, long)
插入值。见here。【参考方案4】:
参见rawQuery(String, String[]) 和Cursor 的文档
你的DADABASE_COMPARE SQL 语句当前无效,loginname
和loginpass
不会被转义,loginname
和and
之间没有空格,你用) 结束语句;代替 ; -- 如果您以 bob 身份使用 password 的密码登录,则该语句将结束为
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 );
...
【讨论】:
【参考方案5】:假设您已经建立了数据库 (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;
【讨论】:
您至少应该指定一列。传递 null 将返回所有列,不鼓励这样做以防止从存储中读取不会使用的数据。 #perfmatters 事实上,如果必要的信息只是一个计数,检索单个列(例如 ID)就足够了【参考方案6】:how to get count column
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 应该更好地推广那里的实用程序......【参考方案7】:如果您使用的是 ContentProvider,那么您可以使用:
Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] "count(*)",
uname=" + loginname + " and pwd=" + loginpass, null, null);
cursor.moveToFirst();
int count = cursor.getInt(0);
【讨论】:
【参考方案8】:如果您想获取记录数,则必须在某个字段上应用分组依据或应用以下查询。
喜欢
db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
【讨论】:
【参考方案9】:另一种方法是使用:
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);
如果您可以考虑摆脱原始查询。
【讨论】:
【参考方案10】:int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
【讨论】:
以上是关于Android中的SQLite查询来计算行数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SQLite 在 Android 中获取查询的行数?
如何获得总数。行数,在 SQLite 中使用 LIMIT 时