0

음악 제목에서 해당 아티스트, 앨범의 이름 및 앨범 표지를 시도하십시오. 나는 LoaderManagerCursorLoader을 사용합니다. 활동이 생성되면 로더를 getLoaderManager().initLoader(1, null, this)으로 점심을 먹습니다.LoaderManager 및 MediaStore에 여러 로더가있는 "No such column found"

에 생성 변수 album가 전체 클래스에 대해 정의하고 dataalbumsTrackRequested은 문자열입니다

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); 
    } 

마침로드에 로더

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; 

    } 

: 여기 내 로더의 코드는 원하는 앨범의 제목과 동일합니다. 그때 물론 커버가 표시되지 않습니다 (ID = 2) 두 번째 로더를 제거하면

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=?) 

하지만, 응용 프로그램이 충돌하지 않습니다

응용 충돌은 내가 얻을. 따라서 문제는 두 번째 로더에서 발생합니다.

내가 뭘 잘못하고 있니? 나는 이미 다른 애플 리케이션 중 하나에서 이렇게 커버를 얻기 위해 달성했습니다 colomn album_art 존재 확신합니다. 하지만 여기에서는 버그가 어디에서 유래되었는지 찾을 수 없습니다. 여러 대의 로더를 사용하기 때문입니까?

답변

2

좋아, 문제가 해결되었습니다. 두 번째 로더에서

1)

, 내가 대신 MediaStore.Audio.albums.ALBUM

2)MediaStore.Audio.Media.ALBUM를 사용하고있었습니다 내 투사였다 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 나는 LoaderOnLoadFinishedcursor.move(cursor.getPosition()+2)으로 해결했습니다. 그것은 끔찍한 해킹이지만 작동합니다.

분명히 나는이 문제가있는 유일한 사람이 아니었지만 (다른 말로하면이 post 참조) 다른 방법으로 해결했습니다.

관련 문제