14

我刚刚在一个 android 应用程序中编写了一个函数,它使用 Java 中的标准“文件”类删除一个文件。IE:

String fileName= "/mnt/Gallery/Img001.jpg";
File file = new File(fileName);
file.delete();

虽然上述过程很简单,但我一直想知道通过“ContentResolver”做同样的事情是否有什么好处。任何意见,将不胜感激。

- - - - - - - - - - - - - - - - - - - - - 编辑 - - - - ---------------------------------

这是通过内容解析器删除文件的示例。这个例子假设被删除的文件是一个图像并且它的'id'是已知的。

long mediaId = 155; // NOTE: You would normally obtain this from the content provider!
Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri itemUri = ContentUris.withAppendedId(contentUri, mediaId);

int rows = getContentResolver().delete(itemUri, null, null);

String path = itemUri.getEncodedPath();
if(rows == 0)
{
    Log.e("Example Code:","Could not delete "+path+" :(");
}
else
{
    Log.d("Example Code:","Deleted "+path+ " ^_^");
}
4

1 回答 1

10

与直接操作数据相比,Android 的内容提供程序框架具有某些额外的优势。

您可以考虑“文件在哪里以及谁可能正在删除它”。

方案 1

文件位于 SD 卡(您的应用程序可访问的路径)上,您的应用程序正在删除它。

解决方案:由于您可以访问路径,因此 java 方法将使用文件 Uri,例如:

文件://mnt/sdcard/downloads/image.jpeg

方案 2

文件位于另一个应用程序(例如保管箱)中,您的应用程序需要删除该文件。

解决方案:这意味着该文件实际上驻留在另一个应用程序的私有存储中。一个文件:Uri 会用上面的方法给你拒绝访问。因此,您的应用将需要从包含该文件的应用中获取内容 Uri,并调用其内容提供程序进行删除。

fileUri = Uri.parse ("content : // " + packageContainingTheFile " + fileId); // 将其替换为从应用程序获取的 Uri。getContext().getContentResolver().delete (fileUri, null, null);

方案 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 并希望了解更新或希望将您的应用程序数据的删除暴露给其他应用程序,那么内容提供程序是最干净的方法。

于 2014-10-14T11:47:34.137 回答