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

前端之家收集整理的这篇文章主要介绍了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

@H_403_31@

情景2

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

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

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

@H_403_31@

情景3

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

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

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

@H_403_31@

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

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

@H_403_31@

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

情景4

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

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

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

@H_403_31@

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

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

@H_403_31@

概要

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

猜你在找的Java相关文章