【发布时间】:2014-07-11 19:43:45
【问题描述】:
在我当前的 Android 项目中,我遇到了一个奇怪的错误。
每次我发出query method 时都会收到错误消息,指出传递的投影字符串[] 参数的列不存在(包含_id 列字段)。尽管如此,传递 null(因此允许返回所有列)工作正常,所以我必须假设这不是列名不匹配的问题。此外,当从 Cursor 对象中检索数据时,列名没有任何问题,因为我可以通过在 query() 上指定相同的列名来安全地获取所有数据。
我目前正在查询 MediaStore.Audio.* 数据库,并且 Manifest 文件中的所有权限和最终设置都正常。
这是我的代码 sn-p:
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));
为了清楚起见,这里是我使用 Cursor 对象的地方:
@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,但我不想检索我不会使用的内容。
如果您需要更多信息,请询问。
【问题讨论】:
-
将 BaseColumns._ID 添加到投影数组
-
啊哈,不要覆盖 bindView,改用 ViewBinder
-
不敢相信我的眼睛。它起作用了(为方便起见,通过了 Audio.Artists),但我看不出它是怎么可能的!请回答您的评论,解释您的解决方案的性质,我会尽快接受。非常感谢。