【问题标题】:Android ContentResolver.query() throwing exception when passing a String[] projection argument传递 String[] 投影参数时,Android ContentResolver.query() 抛出异常
【发布时间】: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),但我看不出它是怎么可能的!请回答您的评论,解释您的解决方案的性质,我会尽快接受。非常感谢。

标签: android sql cursor


【解决方案1】:

将 BaseColumns._ID 添加到投影数组。这是使用 CursorAdapter 时所需的列(我从上下文中假设您正在使用 SimpleCursorAdapter)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2020-07-06
    • 2020-12-27
    • 2015-03-04
    • 1970-01-01
    • 2018-01-30
    • 2010-09-13
    • 2013-05-24
    相关资源
    最近更新 更多