【发布时间】:2016-03-18 08:53:48
【问题描述】:
我正在实现一个内容提供程序,它由一个相当复杂的 SQLite DB 模式支持。数据库有一些联结表,我不确定它们是否应该对 Content Provider 的用户可见。
父表通过Contract 公开,每个表都有自己的内容URI,等等。现在,当通过ContentResolver#applyBatch() 方法插入数据时,我为每个表的内容URI 创建ContentProviderOperation。到目前为止,一切都清楚了。但我的问题是,应该如何填充联结表,因为它们没有自己的内容 URI?
为了说明这一点,这里有一个例子。我有 2 个“父”表,Movies 和 Actors。它们之间的关系是多对多的,因此我有一个名为MoviesActors 的连接表。
要一次性插入,我执行以下操作:
List<ContentProviderOperation> operations = new ArrayList<>;
// movie
operations.add(ContentProviderOperation.newInsert(Contract.Movie.ContentUri).withValue("movie_id", "23asd2kwe0231123sa").build());
// actor
operations.add(ContentProviderOperation.newInsert(Contract.Actor.ContentUri).withValue("actor_id", "89asd02kjlwe081231a").build());
getContentResolver().applyBatch(authority, operations);
连接表MoviesActors 应该插入一行包含movie_id 和actor_id。在这种情况下我该如何处理连接表?
我想到的唯一一件事是扩展合同以使内容 URI 指向联结表并添加另一个 ContentProviderOperation,否则,您如何将 movie_id 和 actor_id 与 ContentProvider#applyBatch() 通信?
我宁愿不将联结表暴露给 ContentProvider 的用户,但我在这里可能是错的......也许这就是它应该在 Android 上完成的方式?
我已经搜索这个主题好几天了,但还没有找到答案。 任何帮助将不胜感激。
额外问题:
是否有必要通过合约暴露每一个表?例如,当子表处于一对多关系时。我特别指的是插入/更新/删除,因为我知道使用查询我可以简单地进行连接,但也许我在这里也错了。
非常感谢!
注意:我对 3rd 方库解决方案不感兴趣。
【问题讨论】:
标签: android database sqlite android-contentprovider junction-table