当前位置: 首页 > 面试题库 >

通过“ ContentResolver”删除文件,而不是通过“ file.delete()”删除文件

宋俊艾
2023-03-14
问题内容

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

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

尽管上面的过程很简单,但我一直想知道通过“ ContentResolver”执行该操作是否有任何好处。任何意见,将不胜感激。

干杯,

杰瑞德

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

这是通过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一起使用,例如:

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

方案2

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

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

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

场景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就位,并且希望收到有关更新的通知或希望将您的应用程序数据的删除公开给其他应用程序,则内容提供者是最干净的方法。



 类似资料:
  • 问题内容: 如果文件位于另一个目录中,如何使用PHP从服务器中删除文件? 这是我的页面布局: (此文件将删除我对数据库的所有条目,并且还应删除相关文件) (文件所在的位置。) 我正在使用的功能: 但这总是给我一个错误,该文件不存在。有任何想法吗? 问题答案: 以下应该有帮助 —返回规范化的绝对​​路径名 —告诉文件名是否可写 —删除文件 通过realpath运行文件路径,然后检查返回的路径是否可写

  • 问题内容: 我有以下Java代码,它会遍历目录中的所有文件并将其删除。 但是,它不会删除所有文件。在执行此操作时,通常会留下几千个中的20-30个。是否有可能解决此问题,或者我偶然发现了一些最好单独使用的Java伏都教徒? 问题答案: 强制使用垃圾回收器运行会使所有文件可删除。

  • 我们可以通过获取url来删除图像还是有其他方法?

  • 我正在尝试删除图像文件后,填充了关于文件的数据在一个模式。 我的jQuery如下所示: 和我的Coldfusion文件: 这是在我签入网络面板时将作为数据发送,并返回一个200,尽管我看不到cfdump的内容。 我对FE还行,对CF不是那么热,我的猜测是我的CF过于复杂,但也没有做我希望它能做的事情。我确实试着参考了我以前写的一些东西,再加上下面这个: 如何使用Ajax将Javascript变量传

  • 问题内容: : 如何删除其中所有空白的新行? 命令输出: : 问题答案: (如果你真的想这样做在sed,则:) (如果你真的想这样做的AWK,然后:)

  • 我有一个整数和零的列表。我想只过滤掉Nones。 这将删除None,但也删除0(整数)。我想以保持0(整数)的方式修改它 结果是一个列表[1,0,1,0,1,0,1,0]--