作者:本多天舞 | 来源:互联网 | 2023-01-03 03:28
如何解决《SQL和sqlite3都返回`count(*)`的正确结果.SQLiteforAndroid总是返回1.这怎么可能?为什么不是一个bug?》经验,为你挑选了1个好方法。
请考虑此计划细分:
Cursor cursor = mDatabase.query(TABLE_NAME, mColumns, null, null,null, null, null);
int nRows = cursor.getCount();
请注意,从Log
下面的输出中,这会将正确的行数返回到nRows
-86000.
以下是任何精通SQL的开发人员都希望将86000返回到x
:
Cursor c2 = mDatabase.rawQuery("select count(*) from " + TABLE_NAME, null);
int x = c2.getCount();
这就是为什么他们会期望--sqlite3.exe产生这样的结果:
sqlite> select count(*) from wordlist;
86000
但是,x
Android SQLite 返回的结果是1.
这Log
是上面代码底部的语句:
Log.w("`````dbDump","rows: " + nRows + " or is it " + x + " rows?");
这是它的输出:
W/`````dbDump: rows: 86000 or is it 1 rows?
答案是数据库有86000行,而不是1.
我的问题很简单(并在标题中说明):
为什么有人试图(即使松散地)模拟SQL设计常用函数,例如count(*)
总是返回相同的值?
如果你选择向我投票,请继续,但请回答这个问题.这似乎是一个错误,因为没有人会期望任何函数总是返回一个恒定的结果.
像问题类似的Gripes:
如果真的在某处记录并且你找到它,你会期望总是返回1.在那种情况下,在哪里?(URL,好吗?)
是否真的有count(*)
用来永远返回1?(我想一个答案可能是删除它或使其正常工作需要重大改写.)
如果你不认为这些是合法的问题,那么你并没有花太多时间试图找出你做错了什么,事实证明,这只是简单地使用SQL知识和rawQuery
.
1> Eugen Pechan..:
这段代码
Cursor c2 = mDatabase.rawQuery("select count(*) from " + TABLE_NAME, null);
给你一行一列,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.
应该提到[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) ).