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

cur*_*zen 8 android many-to-many android-contentprovider

我有一个简单的Notes应用程序,其功能类似于Android NotePad示例.一个补充是每个笔记都可以有标签.A Note可以有几个Tags,一个Tag可以属于几个Notes - 从而使这成为多对多的关系.

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

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

  1. 给定a Note ID,我想返回与该Note相关的所有标签.我如何设置ContentUri这种情况?既不会"content://myexample/note/#""content://myexample/tag/#"不会达到目的.

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

提前感谢您的建议.

pen*_*hou 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

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


ach*_*hie 6

是的,当您想要实现搜索时,需要使用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,从数据库中获取所需的数据.