自从 Android 中的 SQLite 开始以来,这个问题就一直困扰着我。选择参数是Strings
. 什么?为什么?
让我们看看我的问题。我有一个正确填充的数据库:
sqlite> select count (*) from issues where project_id = 1;
3819
伟大的。让我们看一下代码:
public Cursor selectAllCursor(final long projectId) {
final String selection = projectId > 0 ? KEY_PROJECT + " = ?" : null;
final String[] selArgs = projectId > 0 ? new String[] {
Long.toString(projectId)
} : null;
final Cursor c = mDb.query(TABLE_ISSUES, null, selection, selArgs, null, null, null);
c.moveToFirst();
return c;
}
嗯,返回Cursor
的是空的。为什么?
sqlite> select count (*) from issues where project_id = '1';
0
嗯,这就是为什么。
我发现的唯一解决方法是:
public Cursor selectAllCursor(final long projectId) {
final String selection = projectId > 0 ? KEY_PROJECT + " = " + projectId : null;
final String[] selArgs = null;
final Cursor c = mDb.query(TABLE_ISSUES, null, selection, selArgs, null, null, null);
c.moveToFirst();
return c;
}
它有效,但我觉得这很难看。
为什么选择参数不是数组Object
而不是String
?Android 框架会测试对象类型,如果它是整数 ( int
/ long
),它会告诉 SQLite 将其视为整数。