我刚刚在Android应用程序中编写了一个函数,该函数使用Java中的标准"File"类删除文件.即:
String fileName= "/mnt/Gallery/Img001.jpg";
File file = new File(fileName);
file.delete();
Run Code Online (Sandbox Code Playgroud)
虽然上面的过程很简单,但我一直想知道通过'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+ " ^_^");
}
Run Code Online (Sandbox Code Playgroud)
与直接操作数据相比,Android的内容提供程序框架具有一些额外的优势.
您可以根据"文件驻留位置以及可能删除文件的位置"进行思考.
文件驻留在SD卡(您的应用程序可访问的路径)上,您的应用程序正在删除它.
解决方案:由于您可以访问该路径,因此Java方法将使用文件Uri,如:
文件://mnt/sdcard/downloads/image.jpeg
文件驻留在另一个应用程序(比如dropbox)中,您的应用程序需要删除该文件.
解决方案:这意味着该文件实际上驻留在另一个应用程序的私有存储中.文件:Uri将通过上述方法拒绝访问.因此,您的应用需要从包含该文件的应用中获取内容Uri,并调用其内容提供商进行删除.
fileUri = Uri.parse("content://"+ packageContainingTheFile"+ fileId); //用从应用程序获取的Uri替换它.getContext().getContentResolver().delete(fileUri,null,null);
文件位于应用程序的包目录中,即在data/data/com.yourpackage/yourfolder/yourfile.xxx下,您的应用程序是唯一删除它的应用程序.
解决方案:此处,由于您有权删除文件,因此上述任一方法都可以使用.Uri看起来像:
文件://data/data/yourpackage/folder/file.ext
这里使用内容提供程序的主要优点是您可以自动获取观察者模型.内容提供程序回调是定义数据的明确定义的入口点.因此,它是一个通过以下方式通知其他人更改的理想位置:
getContext().getContentResolver().notify(uri,null)
假设您有显示此类文件项列表的视图.删除完成后,您就会收到通知.
文件位于应用程序的包目录中,即在data/data/com.yourpackage/yourfolder/yourfile.xxx下,并且您希望将删除功能公开给其他应用程序.
解决方案:这与方案1类似,只是反过来.其他应用程序无法使用Uri删除私有存储中的文件
file://data/data/yourpackage/folder/file.ext //仅适用于您的应用
他们需要在你的内容提供商中打电话给Uri这样做.
content:// providerAuthority/delete/id,您的内容提供商需要将其映射到file.ext绝对路径.
总而言之,内容提供者的使用是必要的,有些情况是可选的,而其他情况则是可选的.这主要取决于您的应用程序要求.如果您有视图,CursorLoaders,并希望了解更新或希望将您的应用程序数据删除到其他应用程序,内容提供商是最干净的方法.