ContentProvider 数据绑定有问题
Having problems with ContentProvider data binding
我想了解 ContentProvider 的工作原理以及防止我的应用程序在绑定异步任务的返回数据之前旋转时崩溃,因此我决定将它们添加到第一个 Spotify 项目中。我见过的所有示例之间的一个区别是,就此应用程序而言,我没有将数据存储在 sqlite 中,因此我没有使用 SqliteCursor,而是使用了 MatrixCursor。但是,我很确定我遇到的问题是无关的。
在该片段的 onCreateView 方法中,我调用了 .query(),我的内容提供者收到该调用,returns 由于尚未执行搜索,因此没有预期的数据。输入一些搜索文本后,将进行 api 调用并返回数据。然后,我在提供程序上执行 bulkInsert(),然后调用 .notifyChange() 方法。这是我希望在我的片段中的 onCreateView 中绑定的游标通过再次调用 contentProvider 的 .query() 方法来执行更新的地方,但它没有。
我已经将我的项目与与我所在的分支相匹配的 Udacity 项目进行了比较,看不出任何会导致此问题的差异。 post 这里有相当多的代码,除非我 post 全部完成,否则我可能最终会遗漏一些内容,你们中的一些人可能想看一下,所以下面是 link 到我的 github 分支进行这些更改。任何帮助将不胜感激。
如果我在尝试使用 ContentProvider 进行这样的搜索时偏离轨道,请告诉我:)
正在从艺术家搜索片段调用内容提供者https://github.com/chrisolsen/coursera-spotify/blob/content-provider/app/src/main/java/org/chrisolsen/spotify/ArtistSearchActivityFragment.java
This is where I would expect the cursor bound in the onCreateView in
my fragment to perform an update by calling the .query() method
of the contentProvider again, but it doesn't.
我所有的经验都是 ContentProviders
使用 SQLite 数据库。我也不是很熟悉早期 Android 版本。有了这些注意事项,我会说我几乎可以肯定 Cursor
从未对 CP 数据更改通知进行过自动重新查询。如 docs for Cursor 中所述,有一些方法可以指定要监视的 ContentObserver
和 Uri
,但这些只是让您(或加载程序——见下文)添加重新查询逻辑。
因为许多 CP 使用无法在主线程上访问的 SQLite 数据库或其他存储,查询 ContentProvider
的常见模式是使用 CursorLoader. A CursorLoader
does react to a data change notification by re-querying and delivering an updated cursor. This CursorLoader guide may be helpful, although because you are storing your artist data in memory, you don't need the background thread features. If your storage design evolves to use an SQLite DB, CursorLoader
and the Loader framework 是可行的方法。
我想了解 ContentProvider 的工作原理以及防止我的应用程序在绑定异步任务的返回数据之前旋转时崩溃,因此我决定将它们添加到第一个 Spotify 项目中。我见过的所有示例之间的一个区别是,就此应用程序而言,我没有将数据存储在 sqlite 中,因此我没有使用 SqliteCursor,而是使用了 MatrixCursor。但是,我很确定我遇到的问题是无关的。
在该片段的 onCreateView 方法中,我调用了 .query(),我的内容提供者收到该调用,returns 由于尚未执行搜索,因此没有预期的数据。输入一些搜索文本后,将进行 api 调用并返回数据。然后,我在提供程序上执行 bulkInsert(),然后调用 .notifyChange() 方法。这是我希望在我的片段中的 onCreateView 中绑定的游标通过再次调用 contentProvider 的 .query() 方法来执行更新的地方,但它没有。
我已经将我的项目与与我所在的分支相匹配的 Udacity 项目进行了比较,看不出任何会导致此问题的差异。 post 这里有相当多的代码,除非我 post 全部完成,否则我可能最终会遗漏一些内容,你们中的一些人可能想看一下,所以下面是 link 到我的 github 分支进行这些更改。任何帮助将不胜感激。
如果我在尝试使用 ContentProvider 进行这样的搜索时偏离轨道,请告诉我:)
正在从艺术家搜索片段调用内容提供者https://github.com/chrisolsen/coursera-spotify/blob/content-provider/app/src/main/java/org/chrisolsen/spotify/ArtistSearchActivityFragment.java
This is where I would expect the cursor bound in the onCreateView in my fragment to perform an update by calling the .query() method of the contentProvider again, but it doesn't.
我所有的经验都是 ContentProviders
使用 SQLite 数据库。我也不是很熟悉早期 Android 版本。有了这些注意事项,我会说我几乎可以肯定 Cursor
从未对 CP 数据更改通知进行过自动重新查询。如 docs for Cursor 中所述,有一些方法可以指定要监视的 ContentObserver
和 Uri
,但这些只是让您(或加载程序——见下文)添加重新查询逻辑。
因为许多 CP 使用无法在主线程上访问的 SQLite 数据库或其他存储,查询 ContentProvider
的常见模式是使用 CursorLoader. A CursorLoader
does react to a data change notification by re-querying and delivering an updated cursor. This CursorLoader guide may be helpful, although because you are storing your artist data in memory, you don't need the background thread features. If your storage design evolves to use an SQLite DB, CursorLoader
and the Loader framework 是可行的方法。