“在光标关闭后尝试访问光标”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“在光标关闭后尝试访问光标”相关的知识,希望对你有一定的参考价值。

我无法理解这个问题。我试图从其他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
    }
}
答案

cursor.close();移动到while循环之外。

编辑..

在while循环迭代后第一次关闭光标,因此您需要将光标放在外面。

另一答案

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

  1. 在访问光标以从光标获取数据之前,需要先将光标移动到第一位。
  2. 当没有返回任何内容或游标为null时,您需要关闭游标。
  3. 将光标移近while循环外部。

所以我建议你重写代码,如下所示。

// 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();

以上是关于“在光标关闭后尝试访问光标”的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数