在LoaderManager和MediaStore中使用多个Loader“找不到这样的列”

时间:2012-06-19 14:32:39

标签: android mediastore android-loadermanager android-cursorloader

从音乐的标题,尝试找到相应的艺术家,ALbum的名字和专辑的封面。我使用LoaderManagerCursorLoader。创建活动后,我使用getLoaderManager().initLoader(1, null, this)午餐加载器。这是我的装载机的代码:

在创建装载程序

static final String[] PLAYER_SUMMARY_PROJECTION = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM};
    static final String[] PLAYER_COVER_SUMMARY_PROJECTION = { MediaStore.Audio.Albums.ALBUM_ID, MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Albums.ALBUM};

    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
        CursorLoader loader;    

    if(id==1){

        String where = android.provider.MediaStore.Audio.Media.TITLE
                  + "=?";
        String whereVal[] = {dataalbumsTrackRequested};
        loader = new CursorLoader(getActivity(), MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,  
        PLAYER_SUMMARY_PROJECTION, where, whereVal,null); }

    else{

         String where2 = android.provider.MediaStore.Audio.Media.ALBUM
          + "=?";
         String whereVal2[] = {album};
         loader = new CursorLoader(getActivity(), MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,  
         PLAYER_COVER_SUMMARY_PROJECTION, where2, whereVal2,null);  }

    return loader;

    }

加载完成

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

     if(loader.getId()==1){

     //Fill the text view with their value

     //Set Title
     String title =cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
     TextView titleView = (TextView)getView().findViewById(R.id.musicTitle);
     titleView.setText(title);

     //Set Artist
     String artist =cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
     TextView artistView = (TextView)getView().findViewById(R.id.artistName);
     if (artist.equals("<unknown>")){artistView.setText(R.string.unknown_album);}
     else { artistView.setText(artist);}

     //Set Album
     album =cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
     TextView albumView = (TextView)getView().findViewById(R.id.albumTitle);
     if (album.equals("<unknown>")){albumView.setText(R.string.unknown_album);}
     else { albumView.setText(album);}

             }

    else {   


     ImageView coverView = (ImageView)getView().findViewById(R.id.playerCoverView);

     if (cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART)).equals(null)){
            //if no cover returned, display the by default (empty) cover
            coverView.setImageResource(R.drawable.listcoverthumbnail);}

     else{
            Bitmap coverImage = BitmapFactory.decodeFile(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART)));
                    coverView.setImageBitmap(coverImage);}

      getLoaderManager().initLoader(2, null, this);
  }

为整个班级定义变量albumdataalbumsTrackRequested是一个等于所需专辑标题的字符串。

应用程序崩溃了,我得到了:

06-19 16:21:42.720: E/AndroidRuntime(6516): Caused by: android.database.sqlite.SQLiteException: no such column: album_art: , while compiling: SELECT album_id, album_art, album FROM audio WHERE (album=?)

如果我删除第二个Loader(Id = 2),那么当然不显示封面,但应用程序不会崩溃。所以问题来自第二个Loader。

我做错了什么?我确定colomn album_art存在,因为我已经实现了在我的其他应用程序中获得这样的封面。但在这里,我找不到bug的来源。是因为我使用多个装载机吗?

1 个答案:

答案 0 :(得分:2)

好的,问题解决了。

1)在第二个加载器中,我使用的是MediaStore.Audio.Media.ALBUM而不是MediaStore.Audio.albums.ALBUM

2)我的预测为PLAYER_COVER_SUMMARY_PROJECTION = { MediaStore.Audio.Albums.ALBUM_ID, MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Albums.ALBUM}

而不是PLAYER_COVER_SUMMARY_PROJECTION = { MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Albums.ALBUM};

然后,如果您收到错误06-19 19:29:18.115: E/AndroidRuntime(22943): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1,我会在cursor.move(cursor.getPosition()+2)的{​​{1}}中使用OnLoadFinished解决该错误。这是一个可怕的黑客,但它的工作原理。

显然我不是唯一有这个问题的人(比如说post),但我已经用另一种方式解决了这个问题。