单个应用中的多个ContentProvider

时间:2016-01-31 15:42:24

标签: android android-contentprovider

为每个表创建ContentProvider是否可以在单个应用中多个内容提供商

我想出于各种原因这样做。

1 - 随着我的应用程序的增长,单个ContentProvider类变得臃肿和混乱。

2 - 我不想与其他应用分享整个ContentProvider类。我只是想分享一些或只有一张桌子。

2 个答案:

答案 0 :(得分:3)

通常,您可以在一个应用中拥有多个内容提供商,因此根本不存在问题。只要确保两个内容提供商都有不同的权限,否则它将无法正常工作。内容提供商权限必须是唯一的。

但是,在决定是否与一个或多个内容提供商合作时,还需要考虑更多事项。以下是其中一些:

你的问题意味着你打算在两个内容提供商中共享同一个SQLite数据库(我从术语"表"中找到了这个数据库),这不是一个好主意。每个内容提供商可能都有自己的数据库SQLiteOpenHelper实例,这意味着您可能遇到锁定问题,请参阅以下答案:https://stackoverflow.com/a/3689883/1558654

您可能会找到一种方法与两个内容提供商共享相同的SQLiteOpenHelper实例,但这很可能会导致糟糕的体系结构以及长期可能出现的其他问题。

因此,如果您想使用多个内容提供商,请确保两个内容提供商都有自己的专用权限和数据库,这也意味着您无法使用某些数据库功能,例如外键约束(或者您我必须自己处理)或交易(如果它们跨越两个数据库)。

关于你的理由#1 :不确定你是在谈论接口(合同)还是关于实际的.java文件,但这并不重要,因为它只是一个架构问题,在拥有单个内容提供商时绝对可以解决。如果您的内容提供者类文件太大,您的体系结构可能不太好。

您是否应该使用两个内容提供商的决定还取决于他们提供的数据类型。

数据是否相关(或者是相同类型的数据)?仅使用一个内容提供商可能会更好。

它完全不相关?两个内容提供商可能是更好的选择。

原因#2 需要更多考虑。问题是为什么不想公开某些表?这是安全/隐私问题吗?或者只是其他应用程序不需要数据?

如果是出于安全或隐私的考虑,最好使用两个内容提供商,并在持有敏感数据的内容上设置android:exported="false"。但即使有一个内容提供商,也有办法保护这些。

如果安全或隐私不是问题,请不要将内容URI发布到公共合同中的其他表格。

答案 1 :(得分:0)

是的,没关系。正如您所指出的那样,它允许每个人包含特定的数据,每个数据都可以拥有适当的权限。