"在游标关闭后尝试访问游标"

时间:2018-03-04 08:54:03

标签: android cursor android-cursor

我无法理解这个问题。我试图从其他stackoverflow问题中获得解决方案,但未能获得解决方案。我之前没有收到此错误。但是,现在我不知道下面的代码有什么问题。请帮我解决一下这个。我遇到了这个问题。

public void getAlbumsLists() {
    final Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
    final String _id = MediaStore.Audio.Albums._ID;
    final String album = MediaStore.Audio.Media.ALBUM;
    final String album_name = MediaStore.Audio.AlbumColumns.ALBUM;
    final String artist = MediaStore.Audio.AlbumColumns.ARTIST;
    final String tracks = MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS;
    //  final String data=MediaStore.Audio.Albums.ALBUM_ID; // NO
    // final String id1=MediaStore.Audio.Albums.ALBUM_ID;
    final String tit = MediaStore.Audio.Albums.ALBUM; //NO
    final String nam = MediaStore.Audio.Albums.ALBUM_KEY; // NO
    final String typ = MediaStore.Audio.Media.MIME_TYPE; // NO
    final String art = MediaStore.Audio.Albums.ALBUM_ART; //<<<< CAN GET
    final String artstkey = MediaStore.Audio.Artists.ARTIST_KEY; //<<<< CAN GET
    final String frstyr = MediaStore.Audio.AlbumColumns.FIRST_YEAR; //<<<< CAN GET
    final String lstyr = MediaStore.Audio.AlbumColumns.LAST_YEAR; //<<<< CAN GET
    final String artstid = "artist_id"; //<<<< CAN GET

    final String[] columns = {"*"};

     Cursor cursor = getActivity().getContentResolver().query(uri, columns, null, null, null);
    // Lists the columns in the cursor
    for (String s : cursor.getColumnNames()) {
        Log.d("COLUMNS", "Column = " + s);
    }

    while (cursor.moveToNext()) {
        String id = (cursor.getString(cursor.getColumnIndex(_id)));
        String name = cursor.getString(cursor.getColumnIndex(album_name));
        String artist2 = cursor.getString(cursor.getColumnIndex(artist));
        String nr = cursor.getString(cursor.getColumnIndex(tracks));
        String x = (cursor.getString(cursor.getColumnIndex(album)));
        //String data1=cursor.getString(cursor.getColumnIndexOrThrow(data)); //<<<< NOT A COLUMN
        // String id2=cursor.getString(cursor.getColumnIndex(data));
        //String title=cursor.getString(cursor.getColumnIndex(tit)); //<<<< NOT A COLUMN
        //String name1=cursor.getString(cursor.getColumnIndex(nam)); //<<<< NOT A COLUMN
        //String type=cursor.getString(cursor.getColumnIndex(typ)); //<<<< NOT A COLUMN
        // AVAIALABLE COLUMNS
        String artwork = cursor.getString(cursor.getColumnIndex(art)); //<<<< ADDED
        String artistkey = cursor.getString(cursor.getColumnIndex(artstkey)); //<<<< ADDED
        String artistid = cursor.getString(cursor.getColumnIndex(artstid)); //<<<< ADDED
        String minyear = cursor.getString(cursor.getColumnIndex(frstyr));
        String maxyear = cursor.getString(cursor.getColumnIndex(lstyr));

        s = new albumInfo(id, name, artist2, nr, artwork, x); // EXCLUDED
        albumList.add(s);

        cursor.close();
        recyclerView1.setAdapter(albumAdapter); // EXCLUDED
    }
}

1 个答案:

答案 0 :(得分:0)

我可以建议三种改进方案。

  1. 在访问光标以从光标获取数据之前,需要先将光标移动到第一位。
  2. 当没有返回任何内容或光标为空时,您需要关闭光标。
  3. 将光标移动到while循环外面。
  4. 所以我建议你重写代码,如下所示。

    // After you have fetched the data from cursor
    if(cursor == null) return;
    if(cursor.size() == 0) {
        cursor.close();
        return;
    }
    
    for (String s : cursor.getColumnNames()) {
        Log.d("COLUMNS", "Column = " + s);
    }
    
    // Move the cursor to the first position. 
    cursor.moveToFirst();
    do {
        String id = (cursor.getString(cursor.getColumnIndex(_id)));
        String name = cursor.getString(cursor.getColumnIndex(album_name));
        String artist2 = cursor.getString(cursor.getColumnIndex(artist));
        String nr = cursor.getString(cursor.getColumnIndex(tracks));
        String x = (cursor.getString(cursor.getColumnIndex(album)));
        // ... Other code 
    } while (cursor.moveToNext());
    
    recyclerView1.setAdapter(albumAdapter); // EXCLUDED 
    
    // Move the cursor outside of while loop
    cursor.close();