应用程序更新时,内部存储文件是否会被删除?

7

已知:

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

如果用户更新应用程序是否会发生同样的情况?


为什么我要问这个问题? 我有一个文件在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) 

1
我仍然会进行额外的检查,以防万一。在这该死的IO系统中,永远不能太确定了! :-) - Sipty
它只会被称为onCreate()/onResume()——确保应用程序不会崩溃,这并不浪费任何东西! - Sipty
您在更新时不会丢失内部文件。但是,您应该始终进行检查;如果用户决定手动删除缓存,会怎样呢? - Knossos
1
如果@Knossos,那么文件就不会在那里,它将从原始文件中复制。但是,在共享首选项或(更好的)数据库中放置应用程序/文件版本并不是很昂贵。 - 323go
1
可能是Android应用更新时的内部存储问题的重复问题。 - Sipty
显示剩余2条评论
3个回答

12

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

您需要添加附加检查。

供参考的是,下面的文档以迂回的方式解释了这一点:

存储选项

请注意第一段:

Android为您提供了多种选项来保存“持久性”应用程序数据。

(强调添加)

稍后在内部存储 下面写道:

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

通过省略,我得出结论:由于这些选项是“持久性的”,而且仅明确声明了这些文件将在卸载时被删除,因此升级将保留这些文件。

根据我的经验,我从未看到在升级期间删除内部文件,因此这个结论也成立。

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

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


为了支持他的推论,你应该看一下这个答案中的对话(我在上面链接了):https://dev59.com/imkv5IYBdhLWcg3wxjvQ#10354757 - Sipty
@Sipty,老实说,我不明白那个答案有什么意义。 - 323go
1
我一直以为当系统升级应用程序时,它会先卸载再安装应用程序,而卸载意味着删除应用程序数据。这就是为什么这让我感到困惑的原因。 - iTurki
2
@iturki,我能理解。我的一个应用程序保留了非常大的内部数据池(2-3GB),这些数据始终对用户可用。此外,这是敏感数据,不能公开。如果每次升级都删除它,那将是一种痛苦的用户体验,并可能导致不合理的数据费用。自从Android 2.2以来,这个应用程序已经被使用了很多年,并且已经进行了无数次升级,但内部文件从未受到损害。 - 323go
@323go,我的应用程序的用户总是抱怨升级后丢失数据,尽管我无法找到根本原因。也许是因为用户正在卸载和安装,由于这种情况经常发生,我正在转向外部存储选项。 - Dileep

2

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

关于数据库,这取决于开发人员构建应用程序的方式,如果有数据库版本的更改,可能会替换或完全删除数据库。


我们正在谈论更新应用程序,而不是卸载它。 - iTurki
我认为我应该给卸载的解释,因为其中涉及了类似的过程。 - Ibukun Muyide

0

通过使用外部存储,即/sdcard/,即使应用被卸载,您的数据也不会被删除。

关于内部存储:这个问题以前已经被问过了:Android更新应用程序时的内部存储

最后,我不会留下任何机会 - 总是要确保检查!


解释一下为什么一个完全有效的答案被踩会很有帮助。 - Sipty
也许有人过于喜欢点踩了...我的回答(正确的答案)也被点踩了。我可以从你的回答中看出来,因为它实际上并没有回答问题。问题是关于“内部”存储而不是“外部”存储,你已经正确地回答了后者。因此,这不是一个答案,我能理解为什么会被点踩。 - 323go
是的,我刚刚重新阅读了问题,并正在更新它。:) - Sipty
2
@Sipty 感谢您分享链接。关于外部存储,不幸的是这不是一个选项。 - iTurki
如果你发现了一个重复的问题,你应该将这个问题标记为重复,并保持Stackoverflow的整洁(没有噪音)。 - 323go
我认为给出详细答案并概述替代方案并不会造成任何噪音。 - Sipty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接