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

我刚刚在 Android应用程序中编写了一个功能,它使用Java中的标准“File”类删除文件.即:
String fileName= "/mnt/gallery/Img001.jpg";
File file = new File(fileName);
file.delete();

虽然上述过程很简单,但我一直在想,通过“ContentResolver”来做同样的事情有什么好处.任何建议将不胜感激.

干杯,

Jarryd

—————————————— EDIT ——- ———————————

以下是通过Content Resolver删除文件的示例.此示例假定要删除文件一个图像,并且其’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+ " ^_^");
}

解决方法

与直接操作数据相比,Android的内容提供商框架具有一定的附加优势.

您可以考虑“文件所在的位置,谁可能正在删除它”.

情景1

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

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

file://mnt/sdcard/downloads/image.jpeg

情景2

文件位于另一个应用程序(称为DropBox)中,您的应用程序需要删除文件.

解决方案:这意味着该文件实际上位于另一个应用程序的私人存储中.一个文件:Uri将上面的方法会给你访问被拒绝.所以,您的应用程序将需要从包含该文件的应用程序中获取内容Uri,并调用内容提供商进行删除.

fileUri = Uri.parse (“content : // ” + packageContainingTheFile ” + fileId); // replace this with Uri obtained from the app.
getContext().getContentResolver().delete (fileUri,null);

情景3

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

解决方案:这里,上述两种方法都可以使用,因为您可以删除文件.
乌里将看起来像:

file://data/data/yourpackage/folder/file.ext

在这里使用内容提供商的主要优点是您自动获得观察者模型.内容提供者回调是一个定义明确的入口点,从数据修改.因此,它是通过以下方式通知他人的一个理想的地方:

getContext().getContentResolver().notify(uri,null)

假设您有视图显示此类文件的列表.删除完成后,可以通知您.

情景4

文件位于您的应用程序包目录中,您要将删除功能公开于其他应用程序.

解决方案:这与场景1相似,只是相反.其他应用程序无法使用Uri删除私人存储中的文件

file://data/data/yourpackage/folder/file.ext // works just for your app

他们需要打电话给您的内容提供商这样做与Uri像.

content://providerAuthority/delete/id
which your content provider will need to map to file.ext absolute path.

概要

总而言之,内容提供者的使用是必要的,而在其他情况下是可选的.它在很大程度上取决于你的应用需求如果您有意见,CursorLoaders就位,想要了解更新,或希望将您的应用程序数据删除到其他应用程序,内容提供商是最干净的方法.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...