我想了解ContentProviders的工作方式,以及在绑定asynctask的返回数据之前阻止我的应用程序在轮换时崩溃,所以我决定将它们添加到第一个Spotify项目中。我看到的所有示例之间的一个区别是,在这个应用程序的情况下,我没有将数据存储在sqlite中,所以不使用SqliteCursor而是使用MatrixCursor。但是,我很确定我所遇到的问题是无关的。
在片段的onCreateView方法中,我调用.query(),我的内容提供者收到该调用,该内容提供者不返回由于尚未执行搜索而预期的数据。输入一些搜索文本后,将进行api调用并返回数据。然后我在提供程序上执行bulkInsert(),然后调用.notifyChange()方法。这是我期望在我的片段中的onCreateView中绑定的游标通过再次调用contentProvider的.query()方法来执行更新,但它没有。
我将我的项目与我所在的分支机构的Udacity项目进行了比较,并且看不出会导致此问题的任何差异。在这里发布了相当多的代码,除非我发布所有内容,否则我可能最终会遗漏一些你可能想要查看的东西,所以下面是一个链接到我的github分支这些变化。任何帮助将不胜感激。
如果我在试图使用ContentProvider进行类似搜索时偏离正轨,请告诉我:)
调用内容提供商答案 0 :(得分:0)
这是我希望光标在onCreateView中绑定的地方 我的片段通过调用.query()方法来执行更新 再次提供contentProvider,但事实并非如此。
我的所有经验都是使用SQLite数据库ContentProviders
。我对早期的Android版本也不是很熟悉。有了这些警告,我会说我几乎肯定Cursor
从未做过自动重新查询以响应CP数据更改通知。正如docs for Cursor中所述,有一些方法可以指定要监视的ContentObserver
和Uri
,但这些方法只是为您(或加载程序 - 见下文)添加重新查询逻辑。
由于许多CP使用SQLite DB或无法在主线程上访问的其他存储,因此查询ContentProvider
的常见模式是使用CursorLoader。 CursorLoader
通过重新查询和传递更新的游标来对数据更改通知做出反应。这个CursorLoader guide可能会有所帮助,但由于您将艺术家数据存储在内存中,因此您不需要后台线程功能。如果您的存储设计发展为使用SQLite数据库,CursorLoader
和Loader framework即可。