无法从CursorWindow读取第0行col -1

时间:2018-02-01 06:25:05

标签: android sqlite android-cursor

我在获取相册的专辑封面时遇到此错误。请解释一下此光标的工作原理以及如何解决此错误。

public  void getAlbums() {
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
    cursor = getContentResolver().query(uri,null, selection,null, null);
    if (cursor != null && cursor.moveToFirst()) {
        do {
             name = (cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums._ID)));
             artist = (cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM)));
             artist1 = (cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART)));
            songInfo s = new songInfo(name,artist, artist1);
            _songs.add(s);
        }
        while (cursor.moveToNext());
        cursor.close();
        recyclerView1.setAdapter(albumAdapter);

    }
}

1 个答案:

答案 0 :(得分:1)

  

无法从CursorWindow

读取第0行,col -1

对于第0行(光标中的第一行),它不能读取索引(偏移量)-1。索引0是第一个库存,第二个是第二个等等。所以你想要访问一个不存在/不可能的列。

但是,如果无法将传递给方法的列名称作为列名称,则getColumnIndex方法将返回-1。

因此,其中一个不能解析/等同于列名。

android.provider.MediaStore.Audio.Albums._ID
android.provider.MediaStore.Audio.Albums.ALBUM
android.provider.MediaStore.Audio.Albums.ALBUM_ART

您可以依次评论每一行来确定哪一行。或者,您可以在行cursor = getContentResolver().query(uri,null, selection,null, null);之后添加以下内容: -

String[] columns = cursor.getColumnNames();
for (String s: columns) {
    Log.d("CURSORCOLUMNS","Found column = " + s);
}
Log.d("NAMECOLUMN","The name column is " + android.provider.MediaStore.Audio.Albums._ID);
Log.d("ARTISTCOLUMN","The artist column is " + android.provider.MediaStore.Audio.Albums.ALBUM);
Log.d("ARTIST1COLUMN","The artist1 column is "+ android.provider.MediaStore.Audio.Albums.ALBUM_ART);

这将显示光标中的列,后跟您希望在光标中的列。后三者中的一个不会在Found列中= ????????。这将是 -1 的原因。