Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中搜索整型数据库_Android_Sqlite - Fatal编程技术网

如何在Android中搜索整型数据库

如何在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 &

自从Android中SQLite诞生以来,这个问题就一直困扰着我。选择参数是
字符串
。什么?为什么?

让我们来看看我的问题。我已正确填写了一个数据库:

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 )