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 语句当前无效,loginnameloginpass 不会被转义,loginnameand 之间没有空格,你用) 结束语句;代替 ; -- 如果您以 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 数据库中的行数

如何获得总数。行数,在 SQLite 中使用 LIMIT 时

计算本周特定日期的行数 sqlite

请问下android studio中的数据库sqlite怎么打开来查询编辑

在 TSQL 中,如何添加一个计数列来计算查询中的行数?