Android:SQLite 查询未绑定(bind)整数参数?

标签 android sqlite parameters

我在 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 指出参数被绑定(bind)为 StringS,但我简直不敢相信......因为那将是主要的......咳咳,...... WTF

我哪里错了?

提前致谢。

最佳答案

这是 OP,我正在进一步研究和试验,得出的结论是 FTS3 是罪魁祸首。因为我需要数据为 searchable by fulltext我正在创建 VIRTUAL TABLE USING FTS3,然后参数绑定(bind)失败。

因为我不想直接查询影子表(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);

这对我来说非常有用,因为我可以使用参数查询数据并在需要时进行全文搜索。查询性能与仅使用一个表时相同。

我希望这对可能遇到相同问题的其他人有所帮助。

干杯,
实验

附言检查元和 it is OK to reply to self ,显然。

关于Android:SQLite 查询未绑定(bind)整数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4847785/

相关文章:

android - 如何在Gradle 3.0.0上使用 'implementation/api'

Android,运行时查看SQLite数据库(不像其他题)

ruby-on-rails - Rails 无法将不允许的参数转换为散列

testing - 如何绘制三个参数的组合

Android 应用程序在物理设备上崩溃但不是模拟器 : "Parcel: dup() failed in Parcel::read [...] error: Too many open files"

android - 如何在 android BottomNavigationView 上获得方形效果而不是波纹?

android - 阻止闹钟在另一个 Activity 中响起 - android

python - 是否有标准方法可以在 python 应用程序之外存储数据库模式

android - 列索引顺序 SQLite 创建表

C# - 函数的返回类型与参数之一相同