2011-01-31 88 views
3

在Android平臺(2.2)上使用參數進行數據庫查詢時遇到問題。我已創建的表是這樣的:Android:SQLite查詢不綁定整數參數?

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的內容提供商不改變PARAMS和無返回值以及調用查詢時,「直接」:

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

查詢工作,如果我這樣做只是使用concat:

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

但這似乎殺死了param查詢的目的,並且很難緩存。 Dalvik抱怨(在做了大量的查詢之後)高速緩存中沒有用於查詢的空間,具有諷刺意味的是,它告訴我用'?'使用參數化查詢。我很樂意,相信我:)

我知道JavaDoc指出參數綁定爲StringS,但我只是簡直不敢相信...因爲那將是主要的...嗯,... WTF

我在哪裏出錯了?

在此先感謝。

回答

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 + ") " + 
");"); 

然後創建視圖的查詢中使用:

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

附: Checked Meta和it is OK to reply to self,顯然。

+0

不僅可以,它實際上是鼓勵 - 如果沒有人提出解決方案,並且您找到一個,分享的榮譽。 – 2011-11-10 23:27:43