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)
});
}