通过'ContentResolver'删除文件,而不是通过'file.delete()'删除它们

时间:2012-06-07 03:14:29

标签: java android

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

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

虽然上面的过程很简单,但我一直想知道通过'ContentResolver'做同样的事情是否有任何好处。任何建议将不胜感激。

干杯,

Jarryd

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

以下是通过内容解析程序删除文件的示例。此示例假定要删除的文件是图像,并且其“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+ " ^_^");
}

1 个答案:

答案 0 :(得分:6)

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

您可以根据'文件位于何处以及可能删除文件的位置进行思考。

场景1

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

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

  

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

场景2

文件驻留在另一个应用程序(例如dropbox)中,您的应用需要删除该文件。

解决方案:这意味着该文件实际上位于另一个应用的私有存储中。文件:Uri将通过上述方法拒绝访问。因此,您的应用需要从包含该文件的应用中获取内容Uri,并调用其内容提供商进行删除。

  

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

场景3

文件位于应用程序的软件包目录中,即data / data / com.yourpackage / yourfolder / yourfile.xxx下,您的应用程序是唯一删除它的应用程序。

解决方案:此处,上述任何一种方法都可以使用,因为您有权删除该文件。 Uri看起来像:

  

文件://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之类的。

  

内容:// providerAuthority /删除/ ID   您的内容提供商需要将其映射到file.ext绝对路径。

摘要

总之,内容提供者的使用是必要的,有些情况是可选的,而其他情况则是可选的。这主要取决于您的应用程序要求。如果您有视图,CursorLoaders,并希望了解更新或希望将您的应用数据删除到其他应用程序,内容提供商是最干净的方法。