【问题标题】:Android Content Provider and Many-to-Many DB relationshipAndroid Content Provider 和多对多 DB 关系
【发布时间】:2011-07-05 03:04:26
【问题描述】:

我有一个简单的 Notes 应用程序,它的功能类似于 Android NotePad 示例。一个补充是每个笔记都可以有标签。一个Note 可以有多个Tags,一个Tag 可以属于多个Notes - 因此这是一个多对多的关系。

我已经使用外键和映射表完成了数据库设计。现在,我希望我的应用能够插入 Android 搜索框架,这需要使用 ContentProvider 来公开我的数据。

对于这种情况,是否有任何最佳做法可以遵循?我确实找到了一些关于 SO 的相关问题,但其中大多数涉及一对多关系(例如this one)。我确实从这些问题中得出结论,最好每个 DB 有一个 ContentProvider,然后使用 Matcher 概念来解析 DB 中的多个表。这仍然存在其他问题。

  1. 给定一个Note ID,我想返回与该注释关联的所有标签。对于这种情况,我该如何设置ContentUri"content://myexample/note/#""content://myexample/tag/#" 都不能达到目的。

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

提前感谢您的建议。

【问题讨论】:

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


    【解决方案1】:

    现在我发现了一些关于 Android ContentProvider 中多对多条目关系的很酷的东西。答案来自 Google I/O 2011 Offcial Android Client 源代码。例如,在 Google I/O 应用程序中,有一个条目叫做Session,另一个条目是Speaker。一个Session 可能有几个Speaker,一个Speaker 将参加几个Session

    那么,我们来看看google的解决方案:

    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

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

    【讨论】:

      【解决方案2】:

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

      您可以使用现有的内容提供程序来检索与笔记关联的标签。

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

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

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

      然后在您的查询/更新/删除/插入方法中解析传入的 URI 以将其与“content://myexample/note/tag/#”匹配。然后在您的数据库或您的内容上适当地实施您的查询,并返回您需要返回的标签。

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

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

      【讨论】:

      • 感谢"content://myexample/note/tag/#" 的提示。我接受这个作为答案,因为它在我的路上帮助了我。
      猜你喜欢
      • 1970-01-01
      • 2017-05-19
      • 2013-08-20
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多