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

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

例如,我有一个Articles表和ArticleExtras表。文章代表文章本身,而ArticleExtras代表有关某些文章的其他信息,例如评论数。

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

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

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

但是,当我获取注释数(ArticleExtras)时,我希望也可以通知正在监视content://com.myapp.content/Articles更改的同一个CursorAdapter,因此可以在ListView中更新行。

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

方法正确吗,或者有什么更好的方法来实现我想要的?

最佳答案

checkout ContactsProvider2,在其中将通知uri设置为AUTHORITY_URI,这似乎是提供程序中其他URI的全部内容。我有同样的问题,我自己尝试过使用具有多个表并在这些表上进行联接的提供程序,而且效果很好。

10-08 04:51