如何实现只读的ContentProvider?

7
我想知道如何最好地实现只读ContentProvider。我希望我的数据源仅能通过ContentProvider的特殊方法进行修改(当然,这些方法不能通过ContentResolver访问),其他应用程序只能使用我的ContentProvider的查询方法,而不能进行插入、删除或更新操作。 显而易见的解决方案似乎是在插入、删除和更新方法中返回null/0/0并且不进行其他操作。但是,是否最好总是在这些方法中抛出异常,以明确表明不允许进行这些操作?或者,是否有可能通过权限限制访问ContentProvider的查询方法?
2个回答

4
两年后,我仍在问自己同样的问题。我明白权限就是答案。
然而,在"插入/删除/更新"方法中,你必须写一些内容(希望不会被调用)。
我认为使用异常是可以的,因为它不应该被调用,如果被调用了,你必须被警告。
但是,这里发现了一行代码:

虽然你必须实现这些方法,但你的代码除了返回预期的数据类型外不需要做任何事情。例如,你可能想防止其他应用程序向某些表中插入数据。为此,你可以忽略对insert()的调用并返回0。

这意味着好的方法只是返回null / 0 / 0。 我将使用这种方式。

3
一种实现这个目标的方法是使用安全权限,你可以在此链接中的ContentProvider段落中访问它。具体来说,在AndroidManifest xml文件中为提供程序设置writePermission

如果您不想使用安全权限,可以使用第二段中提到的方法。我建议抛出异常,以便清楚地表明那些特定的插入/更新/删除功能无法访问。


1
如果您需要在应用程序的活动中访问ContentProvider实例,请按照以下步骤操作:首先,获取ContentProviders权限的ContentProviderClient,然后使用ContentProviderClient#getLocalContentProvider()方法,最后将其转换为您的实现即可。这样就可以访问外部客户端使用的ContentProvider实例了。 - Jens
谢谢!但是,如果我在提供程序的writePermission属性中列出某个特定权限,并且应用程序在其uses-permissions中列出相同的权限,它是否仍然能够访问这些方法? - Steven Meliopoulos
不,getLocalContentProvider只能在本地应用程序内部使用,因此它们无法访问它们。根据您配置的URI方案,writePermission将允许它们在您的提供程序上使用插入/更新和删除操作。 - Jens
据我所知,如果其他应用程序列出了您在writePermission中列出的权限,则它们可以访问这些方法。就像你所说的那样,但是用户必须授予它们,并且开发人员需要知道权限字符串。当然,如果您的CP方法只抛出异常,那么所有这些都无关紧要。 - Justin Breitfeller
@Jens:我的意思是,如果其他应用程序具有相应的权限,它们可以访问插入/删除/更新,而不是我的自定义方法。无论如何,我现在通过在插入/删除/更新中抛出OperationNotSupportedExceptions来完成,并使用我的自定义方法来修改数据。感谢您解释如何获取ContentProvicer实例。我认为如果没有您的帮助,我可能需要很长时间才能弄清楚这一点,现在它完美地工作了。 - Steven Meliopoulos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接