Android Content Provider和多对多数据库关系

时间:2011-07-05 03:04:26

标签: android many-to-many android-contentprovider

我有一个简单的Notes应用程序,其功能与Android NotePad示例类似。一个补充是每个笔记都可以有标签。 Note可以有多个Tag个,而Tag可以属于多个Note个 - 这样就可以建立多对多关系。

我使用外键和映射表完成了数据库设计。现在,我希望我的应用程序插入Android Search Framework,这需要使用ContentProvider来公开我的数据。

此方案是否有任何最佳做法?我确实在SO上找到了一些相关的问题,但大多数问题涉及一对多的关系(例如this one)。我从这些问题中得出结论,每个数据库最好有一个ContentProvider,然后使用Matcher概念来解析数据库中的多个表。这还留下了其他问题。

  1. 鉴于Note ID,我想返回与该笔记相关联的所有标签。如何为这种情况设置ContentUri"content://myexample/note/#""content://myexample/tag/#"均无法实现此目的。

  2. 我所覆盖的6个ContentProvider方法都不适合这样的目的,是吗?我当然可以介绍一种新方法,但我ContentProvider的消费者无法理解这种方法。

  3. 提前感谢您的建议。

2 个答案:

答案 0 :(得分:9)

现在我发现了一些关于Android ContentProvider中多对多条目关系的很酷的东西。答案来自Google I / O 2011 Offcial Android客户端源代码。例如,在Google I / O应用中,有一个名为Session的条目,另一个条目是Speaker。一个Session可能有多个Speaker,一个Speaker会参加多个Session

那么,让我们来看看谷歌的解决方案:

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleProvider.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleContract.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleDatabase.java

也许这个答案会帮助你们。

答案 1 :(得分:5)

是的,当您想要实现搜索时,需要使用ContentProvider实现它。

您可以使用现有的内容提供商来检索与记事相关联的标记。

您可以在“content:// myexample / note / tag /#”形式中定义另一个URL,以获取与特定节点关联的所有标记。

您需要在URI匹配器中添加另一个必须匹配的URI。 说像GET_NOTE_TAGS = 3;

在ContentProvider的getType方法中,返回适当的mime类型。我猜这会与标签的mime类型相同,因为你返回相同的标签。

然后在您的query / update / delete / insert方法中解析传入的URI,使其与“content:// myexample / note / tag /#”匹配。然后在数据库或内容上适当地实现查询,并返回需要返回的标记。

“content:// myexample / note / tag /#”架构只是一个示例,您可以在同一个ContentProvider中使用多个URI。

您还声明必须加入表格。可以使用db.query完成,如果它变得复杂,你可以使用rawqueries,从数据库中获取所需的数据。