首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CursorIndexOutOfBounds与MergeCursor和ContentProvider

CursorIndexOutOfBounds与MergeCursor和ContentProvider
EN

Stack Overflow用户
提问于 2013-10-17 20:35:30
回答 1查看 463关注 0票数 0

我从我的内容提供者返回一个MergeCursor实例,从相同的内容提供者包装一个游标。听起来很奇怪,但我需要它来进行数据聚合。以下是代码:

代码语言:javascript
运行
复制
Cursor filteredLatest = getContext().getContentResolver().query(Latest.CONTENT_URI, ALL,
                    null, null, null);
return new MergeCursor(new Cursor[]{filteredLatest});

这里我不使用setNotificationUri,因为filteredLatest游标已经设置了通知uri。

一切顺利,我可以查看数据,直到我用新的数据更新内容提供者。

然后它就死了

代码语言:javascript
运行
复制
10-18 00:15:19.441: E/AndroidRuntime(31491): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 13
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.CursorWrapper.getLong(CursorWrapper.java:106)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.MergeCursor.getLong(MergeCursor.java:116)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.CursorWrapper.getLong(CursorWrapper.java:106)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.AdapterView.rememberSyncState(AdapterView.java:1195)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:810)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5998)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.CursorAdapter$MyDataSetObserver.onChanged(CursorAdapter.java:467)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.AbstractCursor.requery(AbstractCursor.java:137)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:234)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.CursorWrapper.requery(CursorWrapper.java:186)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.MergeCursor.requery(MergeCursor.java:228)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.CursorWrapper.requery(CursorWrapper.java:186)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.CursorAdapter.onContentChanged(CursorAdapter.java:443)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.widget.CursorAdapter$ChangeObserver.onChange(CursorAdapter.java:459)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.ContentObserver.onChange(ContentObserver.java:129)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:180)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.os.Handler.handleCallback(Handler.java:730)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.os.Looper.loop(Looper.java:137)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at android.app.ActivityThread.main(ActivityThread.java:5103)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at java.lang.reflect.Method.invokeNative(Native Method)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at java.lang.reflect.Method.invoke(Method.java:525)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-18 00:15:19.441: E/AndroidRuntime(31491):    at dalvik.system.NativeStart.main(Native Method)

我已经查看了MergeCursor代码,似乎已经通知了包装游标数据的更改,并将MergeCursor的位置设置为-1。然后,适配器也会收到更改通知,然后就会死掉。

我不知道到哪里去找窃听器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 09:13:19

我的方法是错的。在查看了Android拨号应用程序之后,我决定编写自己的合并适配器,而不是使用有缺陷的MergeCursor。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19436743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档