众所周知:
当用户卸载您的应用时,系统会删除您的所有应用 来自内部存储的文件。
用户更新应用时会发生同样的事情吗?
<小时/> 为什么我要问?我在
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)
答案 0 :(得分:9)
仅在卸载并重新安装时才会删除内部文件。升级将不删除内部文件 - 它不应该。考虑一下,如果它这样做,那么每次升级都会删除你的数据库。
您需要添加额外的支票。
作为参考,以下文档以迂回的方式解释了这一点:
请注意第一段:
Android提供了几种保存持久性的选项 申请数据。
(强调补充)
再往下Internal Storage,然后说
当用户卸载您的应用程序时,这些文件将被删除。
通过省略我得出结论,因为这些选项是&#34;持久的&#34;并且它只是明确声明这些文件将在卸载时删除,升级将保留这些文件。
我从未见过在升级过程中删除了内部文件,因此从经验上看,这也是正确的。
如果您raw
中的文件是只读的,那么它的价值是什么,您甚至不需要复制它。 openRawResource()
将为您提供InputStream
并允许您像访问任何其他文件一样访问它。在内部,它只是:一个文件。
复制到外部存储并不是一个很好的选择,因为用户(以及早期的Android版本,任何其他应用)都可以访问,删除或修改该文件。
答案 1 :(得分:0)
使用external storage
,即/sdcard/
,即使正在卸载该应用,您的数据也不会被删除。
关于internal storage
:之前已经问过这个问题:Android Internal Storage when updating application
最后,我不会遗漏任何机会 - 总是一定要检查!