如何在Android中搜索整型数据库
自从Android中SQLite诞生以来,这个问题就一直困扰着我。选择参数是如何在Android中搜索整型数据库,android,sqlite,Android,Sqlite,自从Android中SQLite诞生以来,这个问题就一直困扰着我。选择参数是字符串。什么?为什么? 让我们来看看我的问题。我已正确填写了一个数据库: sqlite> select count (*) from issues where project_id = 1; 3819 太好了。让我们看看代码: public Cursor selectAllCursor(final long projectId) { final String selection = projectId &
字符串
。什么?为什么?
让我们来看看我的问题。我已正确填写了一个数据库:
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;
}
嗯,返回的游标是空的。为什么?
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;
}
这是可行的,但我觉得这很难看。
为什么选择参数不是对象的数组而不是字符串
?Android框架将测试对象类型,如果它是一个整数(int
/long
),它会告诉SQLite将其视为一个整数。你是对的,很明显,参数将始终绑定为字符串。不确定为什么(这是你的实际问题:-),但找不到任何解决办法
SelectionAgs您可以在选择中包括?s,它将被SelectionAgs中的值替换,以便它们出现在选择中值将被绑定为字符串。
一个“更好”的方法来做你在上面的事情,也许是使用?
e、 g
您是对的,很明显,参数将始终绑定为字符串。不确定为什么(这是你的实际问题:-),但找不到任何解决办法
SelectionAgs您可以在选择中包括?s,它将被SelectionAgs中的值替换,以便它们出现在选择中值将被绑定为字符串。
一个“更好”的方法来做你在上面的事情,也许是使用?
e、 g
参数有助于避免字符串格式问题(包括SQL注入攻击)。
对于其他类型,您不会遇到此类问题
但这仍然意味着您必须根据值的类型使用完全不同的代码。
此外,如果使用,则可以使用其他类型作为参数,但仅适用于单个值(1 x 1)结果集
这就是糟糕的API设计
如果将表列声明为整数
,SQLite将自动将值转换回数字。
但是,这仅适用于直接比较,如列=?
参数有助于避免字符串格式问题(包括SQL注入攻击)。
对于其他类型,您不会遇到此类问题
但这仍然意味着您必须根据值的类型使用完全不同的代码。
此外,如果使用,则可以使用其他类型作为参数,但仅适用于单个值(1 x 1)结果集
这就是糟糕的API设计
如果将表列声明为整数
,SQLite将自动将值转换回数字。
但是,这只适用于直接比较,如Column=?
,根据注释,您可以使用String.valueOf(int)
,它将正常工作。不过仍然很难看。根据一条评论,您可以使用String.valueOf(int)
,它将正常工作。不过还是很难看。
String selection = String.format("%s = %d", KEY_PROJECT, projectId )