我应该在我的应用程序中使用 Android SharedPreferences 还是 SQLite 来实现持久性?

Posted

技术标签:

【中文标题】我应该在我的应用程序中使用 Android SharedPreferences 还是 SQLite 来实现持久性?【英文标题】:Should I use Android SharedPreferences or SQLite for persistence in my app? 【发布时间】:2016-05-31 04:34:28 【问题描述】:

当用户登录我正在开发的应用程序时,后端会发回有关用户的信息。我想保留这些信息,以便在其他活动以及没有网络访问时使用。

我知道的 android 的两个主要持久性选项是 SharedPrefereces 和 SQLite,我正在尝试确定哪个更适合我的用例。有三个要求:

    要存储的数据多为少数原始数据类型或简单引用类型,但也可能需要存储数组或派生类型的对象。 数据的读取和写入应尽可能简单。 写入的数据必须在任何后续读取时都可用。

这是我在这些维度上比较 SharedPreferences 和 SQLite 的尝试。 (请注意,*** 上还有其他问题要求比较 SharedPreferences 和 SQLite——"Pros and Cons of SQLite and Shared Preferences"、"Saving data on Android : File Storage vs SQLite Database vs Shared Preferences"——但答案并未涵盖所有三个维度。)

SharedPreferences

    最自然地使用原始和简单的引用类型,但 GSON 可用于存储任何类型的数据。 可以从 UI 线程写入和读取数据。 由于竞争条件,无法保证写入 SharedPreferences 的数据在任何后续读取时都可用。

SQLite

    可以以自然的方式用于存储任何复杂程度的结构化数据。 应在与 UI 线程分开的线程中写入和读取数据。 使用单例 DatabaseHelper 可确保写入数据库的数据在任何后续读取时都可用。

如果我的评估是正确的,看起来 SharedPreferences 竞争条件意味着我必须改用 SQLite 来满足要求,即使这样做涉及更多。但我的评估是否正确?

【问题讨论】:

【参考方案1】:

你说:

少量原始数据类型或简单引用类型

那么肯定 SharedPreferences 是首选。如果您可以想象有很多相似的数据行,它们都是唯一的行,那么请使用 SQLite。您有三个要求,它们都不需要存储大量相似但独特的数据。

另一方面:

可能还需要存储派生类型的数组或对象。

我建议将这些数据存储在私有文本文件中,并在每次应用启动时尝试解码数据(如果存在)。

【讨论】:

谢谢,阿巴斯。但是 SharedPreferences 的写入延迟仍然是一个问题(如果我是对的)。我已经编辑了问题以强调这一点。 @stevehs17 ,当您想写入 SharedPreferences 时,您可以使用 Editor.apply(); 而不是 Editor.commit()Editor.apply();methos 是异步的,不会给你带来太多麻烦。 Abbas:无论我使用 commit() 还是 apply(),如果我随后尝试检索我保存的值,我不清楚是否可以保证如果我可以使用尝试过快地检索它。这是我的担心。 @stevehs17 如果您使用commit(),那么您不必担心检索您保存的数据,因为它不是异步方法并且 UI 线程 不会继续前进,直到此方法完成。我相信它会像你期望的那样工作。只需运行一个小测试,您就会看到。 谢谢,阿巴斯。但是如果我必须等待 commit() 返回,那么我认为我不应该从 UI 线程调用它。

以上是关于我应该在我的应用程序中使用 Android SharedPreferences 还是 SQLite 来实现持久性?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在我的应用程序中使用 Android SharedPreferences 还是 SQLite 来实现持久性?

限制Google API的Android密钥使用

ios swift SHA1加密

Android 获取开发&测试 SHA1值

什么是 android 中的生产密钥库,如何获得生产密钥库的路径?

在我的屏幕上显示给我的区域中的android上的地图中显示标记