2015-05-21 47 views
0

我想在Android中使用query()函數在SQLiteDatabase上執行查詢。我想在SelectionArgs []中傳遞參數,但是當我使用IN語句時,它似乎不能替代'?'有正確的論點。使用括號和?在Android SQLiteDatabase查詢()

我的查詢看起來是這樣的:

temp = database.query(TABLE_NAME_ENTRIES, 
       new String[] {"_id", "Entry", "Summary"}, 
       "_id IN (?)", 
       new String[] {ids}, null, null, null); 

,並導致空指針。調試給了我執行查詢使用語句「_id IN(?)」的信息,表明它似乎不能代替'?'如預期。當我將查詢改爲

temp = database.query(TABLE_NAME_ENTRIES, 
       new String[] {"_id", "Entry", "Summary"}, 
       "_id IN (" + ids + ")", 
       null, null, null, null); 

取而代之的是,我得到了預期的結果。

我真的很愚蠢在這個問題上,任何想法我做錯了什麼?

+0

「ids」的值是什麼? –

+0

它的一個字符串,像「192,123,23,13」 –

+0

需要將它分解爲一個數組,作爲第四個參數傳遞,第三個(選擇字符串)中的每個索引都有一個「?」。如果它始終是4個ID,則可以對選擇字符串進行硬編碼。否則,你可以使用像Gabriella的'makePlaceholders()'方法來生成它。 –

回答

0

你可以使用這樣的解決方法 - 創建一個動態生成與您和?,的方法,並把它放在這樣的查詢:

String[] ids = { "id1", "id2" }; // do whatever is needed first 
String query = "SELECT * FROM table" 
+ " WHERE _id IN (" + makePlaceholders(ids.length) + ")"; 
Cursor cursor = mDb.rawQuery(query, ids); 


String makePlaceholders(int len) { 
    if (len < 1) { 
     // It will lead to an invalid query anyway .. 
     throw new RuntimeException("No placeholders"); 
    } else { 
     StringBuilder sb = new StringBuilder(len * 2 - 1); 
     sb.append("?"); 
     for (int i = 1; i < len; i++) { 
      sb.append(",?"); 
     } 
     return sb.toString(); 
    } 
} 

附:我認爲查詢中問號前後的空格可能是錯誤的,但我沒有對它進行測試,所以我不能100%確定

+0

對不起,我沒有正確解釋。 ids已經是一個字符串,準備插入而不是'?'。基本上,我想要做的就是取代'?'由ids的值。 我試圖消除空間,沒有改變 –