2011-06-06 74 views
8

我不能得到WHERE IN子句在Android SQLite數據庫上工作。Android的sqlite中的WHERE IN子句?

有什麼辦法可以在android中執行這樣的語句嗎? :

SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3') 
+3

你有什麼異常?你的代碼是什麼樣的? – Maximus 2011-06-06 22:46:30

回答

8

你將不得不使用rawQuery方法:

Cursor c = db.rawQuery("SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3')"); 
+0

謝謝!有效。我試圖這樣以前,但顯然我有一些語法問題... – fediva 2011-06-07 01:13:03

+0

「試圖做到這一點」 – fediva 2011-06-07 01:13:33

2

如果您使用的是內容提供商可以使用查詢功能,例如:

getContentResolver().query(URI,new String[] {"body"}, "title IN ?", new String[] {"('title1','title2','title3')"}, null) 

注意,我還沒有測試過,但根據文檔,這應該工作。

+0

這不適用於Android 4.0.4 - SQLite包裝類拋出異常 – Anatoliy 2012-10-15 07:42:33

+1

這不會工作。它將被轉換成'SELECT body FROM table1 WHERE title IN'('title1','title2','title3')''。注意''圍繞整個參數部分。 – Antimonit 2015-09-15 20:09:53

1

這樣

Cursor mCursor = SQLiteDatabase.query(true, "Name of table","String array of selection columns","title in ('title1', 'title2', 'title3')", null, null, null, null, null); 
if (mCursor != null) { 
    mCursor.moveToFirst(); 
} 
1

請看一看這個answer的另一種方式。它在類似的情況下幫助我。

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

此處的要點是提供可變問號佔位符(?)以匹配您的IN子句項目。當然 - 它們是String數組的參數。

+0

你知道如何用INT []數組來做到這一點嗎? IN所適用的列是INTEGER類型。 – Brabbeldas 2015-05-15 13:02:51

+0

你必須將你的任意數組轉換爲String [] – Anatoliy 2015-05-27 17:24:57

8

您可以使用TextUtils.join(",", parameters)採取sqlite的綁定參數,其中parameters"?"佔位符和結果字符串列表的優點是像"?,?,..,?"

這裏是一個小例子:

Set<Integer> positionsSet = membersListCursorAdapter.getCurrentCheckedPosition(); 
List<String> ids = new ArrayList<>(); 
List<String> parameters = new ArrayList<>(); 
for (Integer position : positionsSet) { 
    ids.add(String.valueOf(membersListCursorAdapter.getItemId(position))); 
    parameters.add("?"); 
} 
getActivity().getContentResolver().delete(
    SharedUserTable.CONTENT_URI, 
    SharedUserTable._ID + " in (" + TextUtils.join(",", parameters) + ")", 
    ids.toArray(new String[ids.size()]) 
); 
+0

謝謝。這幫了我很多。我不知道我必須爲「IN」子句中的每個參數提供一個單獨的佔位符('?')。我認爲只有一個String參數的單個佔位符就足夠了。 – stan0 2017-03-08 14:12:10

+0

這是你怎麼做到的? String where = ContactsContract.RawContacts.CONTACT_ID +「IN(??)」; – 2017-05-17 12:59:41

0

添加到克里斯蒂安答案: 儘管他的回答會的工作,你應該嘗試使用查詢的正確方法:

db.rawQuery("Select * from table1 where title = ?", new String[]{param1});

這方法也可以與WHERE IN子句一起使用,但傳遞的字符串必須採用'asd','zxc','qwe'格式

喜歡這個:

String param1 = "\'asd\',\'zxc\',\'qwe\'"; 
db.rawQuery("Select * from table1 where title in (?)", new String[]{param1});