安卓:SQLite查询无法绑定整数参数?

3

在Android平台(2.2)上使用参数进行数据库查询时,我遇到了问题。我已经创建了这样的表:

db.execSQL("CREATE VIRTUAL TABLE " + Msg._TABLE_NAME + " USING FTS3 ("
            + Msg._ID + " INTEGER, "
            (...)
            + Msg.READ + " SHORT DEFAULT 0,"
            + Msg.URGENT + " SHORT DEFAULT 0"
            + ");");

然后我试图使用参数查询进行查询:
String[] columns = new String[] {Msg.ROWID, Msg.TITLE, Msg.READ, Msg.URGENT};
(...)
getContentResolver().query(Msg.CONTENT_URI, columns, 
    Msg.URGENT + "=? AND " + Msg.READ + "=?" + , whereArgs, null);

whereArgs参数对于每个查询都是不同的:

String[] urgentUnread = new String[]{"1", "0"};
String[] regularUnread = new String[]{"0", "0"};

但是无论它返回什么,它都会返回0个结果/行,即使数据存在。内容提供程序不会更改参数,并且使用QueryBuilder查询也不会返回任何内容,直接调用查询也是如此:

Cursor c = db.query(tables, columns, where, whereArgs, groupBy, having, orderBy, limit);

如果我只做字符串连接,查询就可以工作:

getContentResolver().query(Msg.CONTENT_URI, columns, 
    Msg.READ + "=0 AND " + Msg.URGENT + "=1", null, null);

但这似乎破坏了参数查询的目的,并且很难缓存。 Dalvik抱怨(在进行大量查询后)缓存中没有查询的空间,并具有讽刺意味地告诉我要使用带有“?”的参数化查询。 相信我,我很想这样做 :)

我知道JavaDoc声明参数绑定为字符串,但我简直无法相信...因为那将是重大的...啊嗯,什么鬼

我在哪里错了?

提前致谢。

1个回答

3
这是OP,我进行了进一步的研究和实验,并得出结论,FTS3有责任。由于我需要数据可以通过全文搜索进行搜索,所以我创建了一个VIRTUAL TABLE USING FTS3,然后参数绑定失败了。
由于我不想直接查询影子表(Msg_content),我的解决方案是将数据拆分成两个相关的表:
db.execSQL("CREATE TABLE " + Msg._TABLE_NAME + " (" +
    Msg._ID + PRIMARY_KEY_AUTOINC + 
    Msg.PRIORITY + " TEXT," +
    Msg.RECEIVED + " INTEGER," +
    Msg.MOBILE_STATUS + " INTEGER DEFAULT 0," +
    Msg.READ + " SHORT DEFAULT 0," +
    Msg.FLASH + " SHORT DEFAULT 0" +
");");

db.execSQL("CREATE VIRTUAL TABLE " + MsgText._TABLE_NAME + " USING FTS3 (" + 
    MsgText._ID + PRIMARY_KEY +
    MsgText.TITLE + " TEXT," +
    MsgText.CONTENT + " TEXT," +
    MsgText.KEYWORDS + " TEXT," +
    "FOREIGN KEY(" + MsgText._ID + ") " +
    "REFERENCES " + Msg._TABLE_NAME + "(" + Msg._ID + ") " +
");");

然后我创建了一个视图用于查询:

db.execSQL("CREATE VIEW IF NOT EXISTS " + View.MSG_CONTENT +
    " AS SELECT " +
    Msg._TABLE_NAME + "." + Msg._ID + ", " +
    Msg._TABLE_NAME + "." + Msg.READ + ", " +
    Msg._TABLE_NAME + "." + Msg.FLASH + ", " +
(...)
    MsgText._TABLE_NAME + "." + MsgText.TITLE + ", " +
    MsgText._TABLE_NAME + "." + MsgText.CONTENT +
    " FROM " + Msg._TABLE_NAME + ", " + MsgText._TABLE_NAME +
    " WHERE " + Msg._TABLE_NAME + "." + Msg._ID + "=" +
    MsgText._TABLE_NAME + "." + MsgText._ID);

这对我非常有帮助,因为我可以使用参数查询数据,并在需要时进行全文搜索。查询性能与仅使用一个表时相同。
我希望这能帮助到其他可能遇到相同问题的人。
祝好,
PeS
附注:已检查 Meta 和 自我回复是可以的

不仅可以,实际上这是被鼓励的 - 如果没有人提出解决方案,而你找到了一个,分享一下会得到赞赏。 - Phil Lello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接