在Android平台(2.2)上使用DB参数进行查询时遇到问题。我创建了这样的表:
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);
如果我只做String concat:
,查询就有效getContentResolver().query(Msg.CONTENT_URI, columns,
Msg.READ + "=0 AND " + Msg.URGENT + "=1", null, null);
但这似乎杀死了param查询的目的,并且很难缓存。 Dalvik抱怨(经过大量的查询后)缓存中没有用于查询的空间,具有讽刺意味的是,它告诉我使用参数化查询“?”。我很乐意,相信我:)。
我知道JavaDoc声明参数绑定为StringS但我只是简直无法相信......因为那将是主要的......咳咳,...... WTF
我在哪里出错?
提前致谢。
答案 0 :(得分:3)
这是OP,我正在进一步研究和试验,并得出结论:FTS3
应该受到指责。由于我需要数据为searchable by fulltext,因此我创建了VIRTUAL TABLE USING FTS3
,然后参数绑定失败。
由于我不想直接查询影子表(Msg_content
),我的解决方案是将数据拆分为2个相关表:
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 + ") " +
");");
然后我创建了View以供查询使用:
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
P.S。显然,检查了Meta和it is OK to reply to self。