Вопрос по android – Ошибка курсора Android - «убедитесь, что курсор инициализирован правильно перед доступом к данным из него…»

11

У меня есть действие, когда видоискатель отображает список, содержащий исполнителей из mediastore, при нажатии на которые отображается список альбомов выбранного исполнителя, который, в свою очередь, отображает песни из этого альбома. Как только песня нажата, она должна заполнить текстовое представление строкой "заголовок".

До этого момента все курсоры работали нормально, но, похоже, самый последний из них как-то теряется. Может ли кто-нибудь сказать мне, почему logcat говорит мне:

05-07 23:58:54.195: E/AndroidRuntime(1961): java.lang.IllegalStateException: Couldn't read row 3, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

Конкретный ряд, который не может быть прочитан, зависит от выбранного исполнителя / альбома / песни. Код выглядит следующим образом. Большое спасибо за Вашу помощь.

package music.flipper;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.AlbumColumns;
import android.provider.MediaStore.Audio.ArtistColumns;
import android.provider.MediaStore.Audio.AudioColumns;
import android.provider.MediaStore.MediaColumns;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.ViewFlipper;

public class MusicFlipper extends Activity implements OnItemClickListener {
    /** Called when the activity is first created. */

    ViewFlipper viewflipper;
    Cursor cursor;

    private String currentList = "Artist";
    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

        setContentView(R.layout.flipper);
        //set the main view to flipper.
        viewflipper = (ViewFlipper) findViewById(R.id.viewFlipper1);

        String[] columns = { 
                BaseColumns._ID,
                ArtistColumns.ARTIST 
                };
        //The columns to return for each row.   

        cursor = managedQuery(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
            columns, null, null, null);

        ListView listView = (ListView) findViewById(R.id.listView1);
        listView.setOnItemClickListener(this);

        //set an onitemclicklistener to the first listview in flipper

        String[] displayFields = new String[] { ArtistColumns.ARTIST };
        //set all the artist names to the array 'displayfields'
        int[] displayViews = new int[] { R.id.rowItem };
        //number of rows to display and where to bind them

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.row_item, cursor, displayFields, displayViews);
        listView.setAdapter(adapter); }
        //Take the display fields array, and bind to the matching display row

     @SuppressWarnings("deprecation")

    public void onItemClick(AdapterView<?> a, View v, int position, long id) {

        if( currentList.equals("Artist")) {
            if (cursor.moveToPosition(position)) {
            //once an item is clicked, move the cursor to that items position

            String where = AudioColumns.ARTIST + "=?";
            // Have the cursor look within the artist row?

            String whereVal[] = { cursor.getString(cursor
          .getColumnIndex(AlbumColumns.ARTIST)) };
            //Choose the particular row with the chosen artist's name

            String[] columns = {
                    BaseColumns._ID,
                    AudioColumns.ALBUM,
               };

                String orderBy = BaseColumns._ID;

            cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
                columns, where, whereVal, orderBy);

            ListView listView = (ListView) findViewById(R.id.listView2);
            listView.setOnItemClickListener(this);
            String[] displayFields = new String[] { AudioColumns.ALBUM };
            int[] displayViews = new int[] { R.id.rowItem };
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                R.layout.row_item, cursor, displayFields, displayViews);
            listView.setAdapter(adapter);
            currentList = "Album";
            viewflipper.showNext();}

        } if (currentList.equals("Album")) {
            if (cursor.moveToPosition(position)) {

                String where = AudioColumns.ALBUM
                + "=?";

                String whereVal[] = { cursor.getString(cursor
                .getColumnIndex(AlbumColumns.ALBUM)) };

                String[] columns = {
                        MediaColumns.DATA,
                        BaseColumns._ID,
                        MediaColumns.TITLE,
                        MediaColumns.DISPLAY_NAME,
                        MediaColumns.MIME_TYPE,
                   };

                    String orderBy = MediaColumns.TITLE;

                cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    columns, where, whereVal, orderBy);

                ListView listView = (ListView) findViewById(R.id.listView3);
                listView.setOnItemClickListener(this);
                String[] displayFields = new String[] { MediaColumns.TITLE };
                int[] displayViews = new int[] { R.id.rowItem };
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                    R.layout.row_item, cursor, displayFields, displayViews);
                listView.setAdapter(adapter);
                currentList.equals("Songs");
                viewflipper.showNext();}


        } if (currentList.equals("Songs")) {
            if (cursor.moveToPosition(position)) {

                String title = cursor.getString(cursor.getColumnIndex(MediaColumns.TITLE));

                TextView myTextView = (TextView) findViewById(R.id.title);
                myTextView.setText(title);

            }
        }
    }
}
Барак, не могли бы вы увидеть комментарии ниже, мне бы хотелось немного больше информации о том, как достичь желаемого результата. user1352742
Привет, Тимус, если мой ответ поможет тебе решить / решить проблему, пожалуйста, поставь галочку рядом с ней, чтобы я получил кредит, и все остальные знали, что твоя проблема была решена. Удачи! Barak

Ваш Ответ

1   ответ
23

Couldn't read row 3, **col -1** from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

Это в основном говорит о том, что ваш столбец MediaColumns.TITLE не существует в курсоре. Что является правдой. Он не в вашем первом курсоре (тот, на который он ссылается). Все остальные ваши курсоры находятся внутриif Заявления так выходят за рамки и оставляют только первое.

Вы можете либо снова вытащить курсор, как в других частяхif или найти способ сохранить курсор, который вы получили от последнегоif заявление.

EDIT

Это довольно просто исправить, сделать курсор переменной класса. Кроме того, я бы не стал повторно использовать «курсор». Обозначьте их как отдельные и описательные, это поможет вам сохранить удобочитаемость вашего кода. Я мог бы сделать это так:

public class MusicFlipper extends Activity implements OnItemClickListener {
    private Cursor artistCursor;
    private Cursor albumCursor;

Затем вы называете их так, как вы, но используете отдельные имена.

albumCursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                columns, where, whereVal, orderBy);

Поскольку вы объявили его как переменную класса, он будет доступен через весь класс, поэтому в последней части вы сделаете следующее:

if (currentList.equals("Songs")) {
    if (albumCursor.moveToPosition(position)) {
            String title = albumCursor.getString(albumCursor.getColumnIndex(MediaColumns.TITLE));
            TextView myTextView = (TextView) findViewById(R.id.title);
            myTextView.setText(title);
    }
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы