App Update上是否删除了内部存储文件?

iTu*_*rki 5 android internal-storage

众所周知:

当用户卸载您的应用程序时,系统会从内部存储中删除所有应用程序的文件.

当用户更新应用程序时是否会发生同样的事情?


我为什么要问?我的文件raw/夹中有一个文件,每次运行我的应用程序时都会移动到内部存储器(如果它尚未移动):

//On Application onCreate() method:
InputStream jsonFile = ctx.getResources().openRawResource(R.raw.data);
File file = ctx.getFileStreamPath(Helper.FILE_NAME);
if(file.exists())
    return; //Exit because the file is already been copied.
FileOutputStream fos = ctx.openFileOutput(Helper.FILE_NAME, Context.MODE_PRIVATE);
copyFile(fos, jsonFile); //my method to copy files.
Run Code Online (Sandbox Code Playgroud)

该文件可能会在以后的应用程序版本中更新.如果系统在更新应用程序时删除内部文件,则上述代码将为"确定".但是,如果不是这种情况,那么我需要执行另一项检查以确保用户具有最新版本.像这样的东西:

if(file.exists() && fileVersion == lastVersion) 
Run Code Online (Sandbox Code Playgroud)

323*_*3go 9

仅在卸载并重新安装时才会删除内部文件.升级不会删除内部文件 - 它不应该删除.考虑一下,如果它这样做,那么每次升级都会删除您的数据库.

您需要添加额外的支票.

作为参考,以下文档以迂回的方式解释了这一点:

存储选项

注意第一段:

Android提供了几种保存持久 应用程序数据的选项.

(重点补充)

然后在内部存储下进一步说明

当用户卸载您的应用程序时,将删除这些文件.

由于省略,我得出结论,由于这些选项是"持久的",并且只是明确声明文件将在卸载时删除,因此升级将保留这些文件.

我从未在升级过程中看到内部文件被删除,所以从经验上看,这也是正确的.

对于它的价值,如果你所拥有的文件raw是只读的,你甚至不需要复制它.openRawResource()会给你一个InputStream并允许你像任何其他文件一样访问它.在内部,它只是:一个文件.

复制到外部存储不是一个好的选择,因为用户(以及早期的Android版本,任何其他应用程序)可以访问,删除或修改该文件.

  • @iturki,这是可以理解的.我的一个应用程序保留了一个非常大的内部数据池(2-3GB),这些数据总是必须为用户提供.此外,它是敏感的数据,不能公开.如果每次升级都删除了它,那将是一个痛苦的用户体验,并可能导致奇怪的数据费用.此应用程序自Android 2.2以来一直使用,并且自那时起已经进行了无数次升级,内部文件从未泄露过. (2认同)