15

我有一个 ContentProvider 来处理与我的应用程序相关的所有数据插入和检索,我遵循 Virgil Dobjanschi 在 Google I/O 上建议的模式。我正在使用第一种模式。

我的问题是我有一个由数据库中的多个表表示的逻辑实体。

例如,我有一个 Articles 表和一个 ArticleExtras 表。Articles 代表文章本身,而 ArticleExtras 代表有关特定文章的附加信息,例如评论数。

我在 UI 中使用 CursorAdapter 在 ListView 的一行中显示文章标题和该文章的评论数。

为了实现这一点,我left outer join ArticleExtras on在我的 ContentProvider 查询方法中为 Article 表添加了一条语句,以便 CursorAdapter 获取 ArticleExtras 以及 Article 本身。

当从 Web 获取新文章时,我通​​过 ContentProvider 将其插入数据库,然后通知 CursorAdapter 并更新 UI,这部分按预期工作。

但是当我获取评论的数量 (ArticleExtras) 时,我希望同样的 CursorAdapter 也content://com.myapp.content/Articles收到通知,它正在监视 , 中的变化,因此我可以更新我在 ListView 中的行。

我当前的实现是这样的:在将 ArticleExtras 插入数据库之后,我开始一个新的查询来检查 Articles 表是否有任何与我刚刚插入的 ArticleExtras 相关的行。如果是这样,我将为那篇文章创建一个新的 uri(例如:) content://com.myapp.cotent/Articles/123,然后调用getContext().getContentResolver().notifyChange(uri, null),因此正在监视这篇文章的更改的相应 CursorAdapter 将得到通知。

该方法是否正确,还是有更好的方法来实现我想要的?

4

1 回答 1

5

签出ContactsProvider2,他们在AUTHORITY_URI其中将通知 uri 设置为似乎是提供程序中其他 URI 的全部内容。我有同样的问题,我自己尝试过这个提供多个表并在这些表上连接的提供者,它工作正常。

于 2014-04-21T14:56:24.407 回答