我有一个简单的Notes应用程序,其功能与Android NotePad示例类似。一个补充是每个笔记都可以有标签。 Note
可以有多个Tag
个,而Tag
可以属于多个Note
个 - 这样就可以建立多对多关系。
我使用外键和映射表完成了数据库设计。现在,我希望我的应用程序插入Android Search Framework,这需要使用ContentProvider
来公开我的数据。
此方案是否有任何最佳做法?我确实在SO上找到了一些相关的问题,但大多数问题涉及一对多的关系(例如this one)。我从这些问题中得出结论,每个数据库最好有一个ContentProvider
,然后使用Matcher概念来解析数据库中的多个表。这还留下了其他问题。
鉴于Note ID
,我想返回与该笔记相关联的所有标签。如何为这种情况设置ContentUri
? "content://myexample/note/#"
和"content://myexample/tag/#"
均无法实现此目的。
我所覆盖的6个ContentProvider
方法都不适合这样的目的,是吗?我当然可以介绍一种新方法,但我ContentProvider
的消费者无法理解这种方法。
提前感谢您的建议。
答案 0 :(得分:9)
现在我发现了一些关于Android ContentProvider中多对多条目关系的很酷的东西。答案来自Google I / O 2011 Offcial Android客户端源代码。例如,在Google I / O应用中,有一个名为Session
的条目,另一个条目是Speaker
。一个Session
可能有多个Speaker
,一个Speaker
会参加多个Session
。
那么,让我们来看看谷歌的解决方案:
也许这个答案会帮助你们。
答案 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,从数据库中获取所需的数据。