2014-07-11 2 views
0

현재 Android 프로젝트에서 이상한 오류가 발생했습니다.String [] 투영 인수를 전달할 때 Android ContentResolver.query() 예외가 throw됩니다.

매번 query method을 발행 할 때 전달 된 투영 String [] 인수의 열이 존재하지 않는다는 (_id 열 필드 포함) 오류가 발생합니다. 그럼에도 불구하고 은 null을 전달하므로 모든 열을 반환 할 수 있습니다. 은 매우 양호하게 작동하므로입니다. 따라서 열 이름이 일치하지 않는 문제는 아닌 것으로 간주해야합니다. 또한 Cursor 객체에서 데이터를 검색 할 때 query()에서 동일한 열 이름을 지정하여 모든 데이터를 안전하게 얻을 수 있으므로 열 이름에 아무런 문제가 없습니다.

현재 MediaStore.Audio. * 데이터베이스에서 쿼리하고 있으며 Manifest 파일 내의 모든 사용 권한과 최종 설정은 정상입니다. 여기,

Cursor  artists[] = new Cursor[2]; 

     String projection[] = { 
       Audio.Artists.ARTIST, 
       Audio.Artists.NUMBER_OF_ALBUMS, 
       Audio.Artists.NUMBER_OF_TRACKS, 
     }; 

    artists[0] = this.getActivity().getApplicationContext().getContentResolver().query(
        Audio.Artists.INTERNAL_CONTENT_URI, 
        projection, 
        null, 
        null, 
        Audio.Artists.DEFAULT_SORT_ORDER 
        ); 

    artists[1] = this.getActivity().getApplicationContext().getContentResolver().query(
        Audio.Artists.EXTERNAL_CONTENT_URI, 
        projection, 
        null, 
        null, 
        Audio.Artists.DEFAULT_SORT_ORDER 
        ); 

      this.adapter = new ArtistListAdapter(this.getActivity(), new MergeCursor(artists)); 

은 그냥 명확하게하기 위해 내가 커서 객체를 사용하는 곳입니다 :

내 코드입니다이 코드를 발급

@Override 
public void bindView (View v, Context c, Cursor cursor) { 
    ImageView icon; 
    TextView name, artistInfo; 

    //icon = (ImageView) v.findViewById(R.id.artist_icon); 
    name = (TextView) v.findViewById(R.id.artist_name); 
    artistInfo = (TextView) v.findViewById(R.id.artist_info); 

    //icon.setIcon(icon); 
    name.setText(cursor.getString(cursor.getColumnIndex(Audio.Artists.ARTIST))); 
    artistInfo.setText(
      String.format(
        "%s total albums\n%s total songs", 
        cursor.getString(cursor.getColumnIndex(Audio.Artists.NUMBER_OF_ALBUMS)), 
        cursor.getString(cursor.getColumnIndex(Audio.Artists.NUMBER_OF_TRACKS)) 
      ) 
    ); 
} 

을, 나는 다음과 같은 오류가 나타날 수

07-11 21:28:31.221: E/AndroidRuntime(22737): FATAL EXCEPTION: main 
07-11 21:28:31.221: E/AndroidRuntime(22737): java.lang.IllegalArgumentException: column '_id' does not exist 
07-11 21:28:31.221: E/AndroidRuntime(22737): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303) 
07-11 21:28:31.221: E/AndroidRuntime(22737): at android.support.v4.widget.CursorAdapter.init(CursorAdapter.java:174) 

이 문제의 원인은 무엇이고 어떻게 해결할 수 있습니까? 지금까지는 투영 인수에 null을 전달했지만 사용하지 않을 내용은 검색하지 않으려합니다.

추가 정보가 필요한지 물어보십시오.

+1

BaseColumns._ID를 투영 배열에 추가합니다. – pskink

+0

aha, bindView를 재정의하지 않고 대신 ViewBinder를 사용합니다. – pskink

+0

믿을 수 없습니다. 내 눈. 그것은 효과가 있었고 (편의를 위해 Audio.Artists를 통과 시켰습니다.) 그러나 나는 그것이 가능하다는 것을 알 수 없습니다! 솔루션의 성격을 설명하는 의견을 보내 주시면 최대한 빨리 동의하겠습니다. 대단히 감사합니다. – none

답변

1

투영 배열에 BaseColumns._ID를 추가하십시오. 이것은 CursorAdapter를 사용할 때 필수 열입니다 (SimpleCursorAdapter를 사용하는 컨텍스트에서 가정 함)

관련 문제