Android getContentResolver()在具有大量项目的WHERE子句中使用“IN”
我已完全实现此查询成功,并提供所需数据
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String projection[] = {MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.COMPOSER,
MediaStore.Audio.Media.DURATION,
// android.provider.MediaStore.Audio.Albums.ALBUM_ART,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media._ID,};
String selection1 = MediaStore.Audio.Media.IS_MUSIC + " = 1" + " AND "
+ MediaStore.Audio.Media._ID + " IN(";
for (int i = 0; i < SongsList.size(); i++) {// songslist is an array of IDs
selection1 += "?, ";
}
selection1 = selection1.substring(0, selection1.length() - 2) + ")";
String[] selectionArgs = new String[SongsList.size()];
selectionArgs = SongsList.toArray(selectionArgs);
Cursor cursor = this.getContentResolver().query(uri, projection, selection1,
selectionArgs, null);
但是当项目数量很大时,查询失败,
是否有替代方法可以使用getContentResolver()检索大量项目,而不在WHERE子句中使用“IN”
答案 0 :(得分:1)
使用SQL时,处理大量ID的正确方法是将它们放入临时表中,并将其与媒体表连接。 但是对于内容提供商,您无权访问该数据库,因此无法实现这一目标。
您最好的办法是检索所有行,然后忽略任何没有任何ID的行。
或者,逐个检索行。 (这可能有太多开销。)
(如果您需要将过滤后的结果作为实际的Cursor
对象,请将它们放入
MatrixCursor。)