App更新时是否删除了内部存储文件?

Are Internal Storage Files Deleted on App Update?

据了解:

When the user uninstalls your app, the system removes all your app's files from 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.

该文件可能会在应用程序的未来版本中更新。如果系统在更新应用程序时删除了内部文件,上面的代码就可以了。但是,如果不是这种情况,那么我需要执行另一个检查 以确保用户拥有最新版本 。像这样:

if(file.exists() && fileVersion == lastVersion) 

通过使用external storage,即/sdcard/,您的数据不会被删除,即使应用正在卸载。

关于internal storage: 这个问题之前有人问过: Android Internal Storage when updating application

最后,我不会留下任何侥幸心理——一定要检查!

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

您需要添加额外的支票。

作为参考,以下文档以迂回的方式对此进行了解释:

Storage Options

注意第一段:

Android provides several options for you to save persistent application data.

(强调)

再往下 Internal Storage 然后说

When the user uninstalls your application, these files are removed.

由于遗漏,我得出的结论是,由于这些选项是 "persistent",并且仅明确说明文件将在卸载时删除,因此升级将保留这些文件。

我从未见过在升级过程中删除了内部文件,所以根据经验,这也是正确的。

值得一提的是,如果您在 raw 中的文件是只读的,您甚至不需要复制它。 openRawResource() 会给你一个 InputStream 并允许你像访问任何其他文件一样访问它。在内部,它只是:一个文件。

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

卸载只会删除与应用程序捆绑的内部文件,卸载时不会删除在外部存储中创建的文件夹。对于数据库,数据库将在卸载时被删除,但会保留以供更新的应用程序使用。

还是在数据库上,这取决于开发人员构建应用程序的方式,如果数据库版本发生变化,可以更换或完全删除数据库。