我应该在我的应用程序中使用 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 来实现持久性?