我有一个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的全部内容。我有同样的问题,我自己尝试过使用具有多个表并在这些表上进行联接的提供程序,而且效果很好。