Android getContentResolver() 将“IN”与具有大量项目的 WHERE 子句一起使用
Android getContentResolver() Using “IN” with a WHERE clause with large number of Items
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”
使用 SQL 时,处理大量 ID 的正确方法是将它们放入临时 table,然后将其与媒体 table 合并。
但是对于内容提供者,您无权访问该数据库,因此这是不可能的。
最好的办法是检索所有行,然后忽略任何没有您的 ID 的行。
或者,逐行检索。 (这可能有太多的开销。)
(如果您需要过滤后的结果作为实际的 Cursor
对象,请将它们放入
MatrixCursor.)
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”
使用 SQL 时,处理大量 ID 的正确方法是将它们放入临时 table,然后将其与媒体 table 合并。 但是对于内容提供者,您无权访问该数据库,因此这是不可能的。
最好的办法是检索所有行,然后忽略任何没有您的 ID 的行。
或者,逐行检索。 (这可能有太多的开销。)
(如果您需要过滤后的结果作为实际的 Cursor
对象,请将它们放入
MatrixCursor.)