与直接处理数据相比,Android的内容提供程序框架具有某些其他优势。
您可以考虑以下内容:“文件驻留在哪里以及谁可以删除它”。
场景1
文件位于SD卡(您的应用可访问的路径)上,而您的应用正在删除该文件。
解决方案: 由于您可以访问该路径,因此java方法将与文件Uri一起使用,例如:
文件://mnt/sdcard/downloads/image.jpeg
方案2
文件驻留在另一个应用程序中(例如Dropbox),您的应用程序需要删除该文件。
解决方案
:这意味着该文件实际上位于另一个应用程序的私有存储中。一个文件:Uri将上述方法将使您的访问被拒绝。因此,您的应用将需要从包含文件的应用中获取内容Uri,并调用其内容提供者进行删除。
getContext()。getContentResolver()。delete(fileUri,null,null); // fileUri =
Uri.parse(“ content://” + packageContainingTheFile“ + fileId);
//将其替换为从应用程序获取的Uri。
场景3
文件位于您应用程序的包目录中,即位于data / data / com.yourpackage / yourfolder /
yourfile.xxx下,并且您的应用程序是唯一将其删除的应用程序。
解决方案: 在这里,由于您有权删除文件,因此上述两种方法都可以使用。Uri看起来像:
file://data/data/yourpackage/folder/file.ext
在这里使用内容提供程序的主要优点是,您可以自动获得观察者模型。内容提供者回调是定义良好的入口点,从那里可以修改数据。因此,它是使用以下方法通知其他人的理想场所:
getContext()。getContentResolver()。notify(uri,null)
假设您有显示此类文件项列表的视图。删除完成后,您会收到通知。
方案4
文件位于应用程序的软件包目录中,即位于data / data / com.yourpackage / yourfolder /
yourfile.xxx下,并且您希望将删除功能公开给其他应用程序。
解决方案 :这与方案1类似,反之亦然。其他应用无法使用Uri删除您私人存储中的文件,例如
file://data/data/yourpackage/folder/file.ext //仅适用于您的应用
他们将需要致电您的内容提供商以使用类似Uri的方式进行操作。
content:// providerAuthority / delete / id,您的内容提供者将需要将其映射到file.ext绝对路径。
摘要
总之,在某些情况下必须使用内容提供程序,而在另一些情况下则是可选的。这在很大程度上取决于您的应用程序要求。如果您有视图,CursorLoaders就位,并且希望收到有关更新的通知或希望将您的应用程序数据的删除公开给其他应用程序,则内容提供者是最干净的方法。



