Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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
Java 如何将INTEGER/NULL绑定到一个?Android中带有rawQuery selectionArgs的占位符?_Java_Android_Sql_Sqlite_Sql Injection - Fatal编程技术网

Java 如何将INTEGER/NULL绑定到一个?Android中带有rawQuery selectionArgs的占位符?

Java 如何将INTEGER/NULL绑定到一个?Android中带有rawQuery selectionArgs的占位符?,java,android,sql,sqlite,sql-injection,Java,Android,Sql,Sqlite,Sql Injection,下面的任何内容都可以更改以获得有效的解决方案我可以完全控制以下所有模式/数据/查询/代码,因此欢迎任何合理的改进:我正在寻找一个简单/干净/切中要害的解决方案。例如,进行两个不同的查询(=?和为null)是最后的选择 问题: 我想更改以下代码,以便调用listCategoriesIn(1)和listCategoriesIn(null),它们都给出了正确的预期结果。 我无法使listCategoriesIn(null)使用WHERE子句,如c.parent=? 是否可以将整数或NULL绑定到=?

下面的任何内容都可以更改以获得有效的解决方案我可以完全控制以下所有模式/数据/查询/代码,因此欢迎任何合理的改进:我正在寻找一个简单/干净/切中要害的解决方案。例如,进行两个不同的查询(
=?
为null
)是最后的选择

问题: 我想更改以下代码,以便调用
listCategoriesIn(1)
listCategoriesIn(null)
,它们都给出了正确的预期结果。 我无法使
listCategoriesIn(null)
使用
WHERE
子句,如
c.parent=?

  • 是否可以将
    整数
    NULL
    绑定到
    =?
  • 我应该如何修改
    WHERE
    子句以使其适用于这两种情况
  • 我还可以改变什么来让它工作
桌子
列表分类在(1)
中:正常工作

listCategoriesIn(null)
:生成的光标为空,可能绑定了
='null'
=null

错误代码#2
列表分类在(1)
中:正常工作

listCategoriesIn(空)
: java.lang.IllegalArgumentException:索引1处的绑定值为null


我认为当字段为空时,需要发送不同的SQL语句

    public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
        if(categoryID == null)
            return db.rawQuery(CATEGORY_QUERY_NULL, null);
        else
            return db.rawQuery(CATEGORY_QUERY, new String[] { categoryID.toString() });
   }

其中,CATEGORY_QUERY_NULL与CATEGORY_QUERY相同,但具有
c.parent为NULL,而不是
c.parent=?
。详细信息见此。

在睡了一觉并开始了新的一天之后,我有了一个顿悟,不需要重复查询即可:

where c.parent = ? or (? = 'null' and c.parent is null)
但是,我们需要复制参数,下面是相应的Java调用:

public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
    return db.rawQuery(CATEGORY_QUERY, new String[] {
        String.valueOf(categoryID), String.valueOf(categoryID)
    });
}
categoryID
null
时,没有NPE,因为它绑定为
“null”
(请参见
valueOf
)。将
null->'null'
传递给驱动程序将激活
WHERE
子句的第二部分,当然
整数
值中没有一个是
='null'
,因此第一部分不起作用


这一技巧之所以有效,是因为SQLite引擎可以处理将
整数
文本
中的数字进行比较。我相信详细信息可以在中找到。

是的,这是我所说的最后一种手段。。。我希望有人能有一个更聪明的解决方案,因为我不想重复复杂的SQL查询。
categoryID==null
在您的第二个分支中总是错误的。您可以使用
return db.rawQuery(CATEGORY_QUERY,新字符串[]{categoryID.toString()})替换整个语句我反对复制,因为如果你考虑在一个代码中有3个可空列,其中,它会爆炸到<代码> 2 ^ 3=8 < /代码>查询->不可维护。我找到的解决方案可以线性组合,尽管有点棘手。
public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
    // public Cursor SQLiteDatabse.rawQuery(String sql, String[] selectionArgs);
    return db.rawQuery(CATEGORY_QUERY, new String[] {
        String.valueOf(categoryID)
    });
}
public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
    // public Cursor SQLiteDatabse.rawQuery(String sql, String[] selectionArgs);
    return db.rawQuery(CATEGORY_QUERY, new String[] {
        categoryID == null? null : categoryID.toString()
    });
}
    public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
        if(categoryID == null)
            return db.rawQuery(CATEGORY_QUERY_NULL, null);
        else
            return db.rawQuery(CATEGORY_QUERY, new String[] { categoryID.toString() });
   }
where c.parent = ? or (? = 'null' and c.parent is null)
public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
    return db.rawQuery(CATEGORY_QUERY, new String[] {
        String.valueOf(categoryID), String.valueOf(categoryID)
    });
}