Android getContentResolver()将“IN”与带有大量Items的WHERE子句一起使用

时间:2017-01-09 06:04:50

标签: android sqlite android-contentresolver

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”

1 个答案:

答案 0 :(得分:1)

使用SQL时,处理大量ID的正确方法是将它们放入临时表中,并将其与媒体表连接。 但是对于内容提供商,您无权访问该数据库,因此无法实现这一目标。

您最好的办法是检索所有行,然后忽略任何没有任何ID的行。

或者,逐个检索行。 (这可能有太多开销。)

(如果您需要将过滤后的结果作为实际的Cursor对象,请将它们放入 MatrixCursor。)