首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将整数/空绑定到?rawQuery selectionArgs在Android中的占位符?

如何将整数/空绑定到?rawQuery selectionArgs在Android中的占位符?
EN

Stack Overflow用户
提问于 2015-03-10 20:28:47
回答 2查看 760关注 0票数 2

任何东西都可以在下面更改以达到工作解决方案!我完全控制了下面所有的模式/数据/查询/代码,所以任何合理的改进都是受欢迎的:我正在寻找一个简单/干净/到点的解决方案。例如,进行两个不同的查询(__、= ?is null__)是的最后手段__。

问题

我想修改下面的代码,这样我就可以调用listCategoriesIn(1)listCategoriesIn(null),它们都给出了正确的预期结果。我不能让listCategoriesIn(null)使用像c.parent = ?这样的WHERE子句。

  • 是否有可能将INTEGERNULL绑定到= ?
  • 我应该如何修改WHERE子句,使其在这两种情况下都能工作?
  • 我还能改变什么让它发挥作用呢?

表格

代码语言:javascript
复制
CREATE TABLE Category (
    _id         INTEGER      NOT NULL,
    name        VARCHAR      NOT NULL,
    parent      INTEGER          NULL --< important bit
        CONSTRAINT fk_Category_parent
            REFERENCES Category(_id)
            ON UPDATE CASCADE
            ON DELETE CASCADE,
    PRIMARY KEY(_id AUTOINCREMENT),
    UNIQUE(name)
);

样本数据

代码语言:javascript
复制
INSERT INTO Category
                  (_id, parent, name)
          SELECT     0,   NULL, 'cat0'         --< expected for listCategoriesIn(null)
    UNION SELECT     1,   NULL, 'cat1'         --< expected for listCategoriesIn(null)
    UNION SELECT    11,      1,   'cat1-1'     --< expected for listCategoriesIn(1)
    UNION SELECT    12,      1,   'cat1-2'     --< expected for listCategoriesIn(1)
    UNION SELECT   121,     12,     'cat1-2-1'
    UNION SELECT   122,     12,     'cat1-2-2'
    UNION SELECT    13,      1,   'cat1-3'     --< expected for listCategoriesIn(1)
    UNION SELECT   131,     13,     'cat1-3-1'
    UNION SELECT     2,   NULL, 'cat2'         --< expected for listCategoriesIn(null)
    UNION SELECT    21,      2,   'cat2-1'
    UNION SELECT     3,   NULL, 'cat3'         --< expected for listCategoriesIn(null)
;

查询

IRL I使用更复杂的方法,包括视图、子查询和多个联接。

代码语言:javascript
复制
select
    c.*,
    (select count() from Category where parent = c._id) as count
from Category c
where c.parent = ? --< important bit
;

错误代码#1

代码语言:javascript
复制
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)
    });
}

listCategoriesIn(1):工作正常 listCategoriesIn(null):生成的游标为空,可能是= 'null'= NULL绑定的。

错误代码#2

代码语言:javascript
复制
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()
    });
}

listCategoriesIn(1):工作正常 listCategoriesIn(null):java.lang.IllegalArgumentException:索引1处的绑定值为null

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-11 17:39:11

睡了一觉,开始了新的一天,我顿悟了,没有重复的查询是可能的:

代码语言:javascript
复制
where c.parent = ? or (? = 'null' and c.parent is null)

但是,我们需要复制这个参数,下面是相应的Java调用:

代码语言:javascript
复制
public Cursor listCategoriesIn(SQLiteDatabase db, Long categoryID) {
    return db.rawQuery(CATEGORY_QUERY, new String[] {
        String.valueOf(categoryID), String.valueOf(categoryID)
    });
}

categoryIDnull时,不存在NPE,因为它绑定为"null" (参见valueOf)。将null->'null'传递给驱动程序将激活WHERE子句的第二部分,当然没有一个INTEGER值是= 'null',因此第一部分不起作用。

这个技巧之所以奏效,是因为S和SQLite引擎可以处理将INTEGERTEXT中的数字进行比较。我确信细节可以在SQLite数据类型文档中找到。

票数 1
EN

Stack Overflow用户

发布于 2015-03-10 21:16:29

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

代码语言:javascript
复制
    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 IS NULL而不是c.parent = ?。有关详细信息,请参阅此回答

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28973491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档