SQL和sqlite3都返回`count(*)`的正确结果.SQLite for Android总是返回1.这怎么可能?为什么不是一个bug?

DSl*_*r64 0 sqlite android

请考虑此计划细分:

Cursor cursor = mDatabase.query(TABLE_NAME, mColumns, null, null,null, null, null);
int nRows = cursor.getCount();
Run Code Online (Sandbox Code Playgroud)

请注意,从Log下面的输出中,这会将正确的行数返回到nRows-86000.

以下是任何精通SQL的开发人员都希望将86000返回到x:

Cursor c2 = mDatabase.rawQuery("select count(*) from " + TABLE_NAME, null);
int x = c2.getCount();
Run Code Online (Sandbox Code Playgroud)

这就是为什么他们会期望--sqlite3.exe产生这样的结果:

sqlite> select count(*) from wordlist;
86000
Run Code Online (Sandbox Code Playgroud)

但是,xAndroid SQLite 返回的结果是1.

Log是上面代码底部的语句:

Log.w("`````dbDump","rows: " + nRows + " or is it " + x + " rows?");
Run Code Online (Sandbox Code Playgroud)

这是它的输出:

W/`````dbDump: rows: 86000 or is it 1 rows?
Run Code Online (Sandbox Code Playgroud)

答案是数据库有86000行,而不是1.

我的问题很简单(并在标题中说明):

为什么有人试图(即使松散地)模拟SQL设计常用函数,例如count(*)总是返回相同的值?

如果你选择向我投票,请继续,但请回答这个问题.这似乎是一个错误,因为没有人会期望任何函数总是返回一个恒定的结果.

像问题类似的Gripes:

如果真的在某处记录并且你找到它,你会期望总是返回1.在那种情况下,在哪里?(URL,好吗?)

是否真的有count(*)用来永远返回1?(我想一个答案可能是删除它或使其正常工作需要重大改写.)

如果你不认为这些是合法的问题,那么你并没有花太多时间试图找出你做错了什么,事实证明,这只是简单地使用SQL知识和rawQuery.

Eug*_*nec 7

这段代码

Cursor c2 = mDatabase.rawQuery("select count(*) from " + TABLE_NAME, null);
Run Code Online (Sandbox Code Playgroud)

给你一行一列,count(*)是位置[0,0]的值.

Cursor.getCount() 返回结果中的行数,在此特定情况下为1.

获得你打电话的价值

c2.moveToFirst(); // Move to first row.
int count = c2.getInt(0); // Get value as integer from first column of current row.
Run Code Online (Sandbox Code Playgroud)

  • 应该提到[longForQuery()](https://developer.android.com/reference/android/database/DatabaseUtils.html#longForQuery(android.database.sqlite.SQLiteDatabase,%20java.lang.String,%20java.lang) .String []))和[queryNumEntries()](https://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries(android.database.sqlite.SQLiteDatabase,%20java.lang.String) ). (2认同)