如果我想要读取数据并进行更改,那么在安卓中用来存储数据的最佳替代选项是什么?数据可以是用户资料、JSON响应或任何对象。 由于我存储了大量数据,我正在寻找其他耗时较少的选项来读取/写入数据。 目前,我的应用程序从活动A转到活动B需要x毫秒,我能否减少这个时间?
如果我想要读取数据并进行更改,那么在安卓中用来存储数据的最佳替代选项是什么?数据可以是用户资料、JSON响应或任何对象。 由于我存储了大量数据,我正在寻找其他耗时较少的选项来读取/写入数据。 目前,我的应用程序从活动A转到活动B需要x毫秒,我能否减少这个时间?
没有深入了解您的使用情况,很难为您推荐适合的方案。
SharedPreferences
可能是一个不错的选择。SharedPreferences
,而应查看 AccountManager
。OkHttp
对此有相当好的支持。谈到加载时间 - SharedPreferences
总体来说速度相当快,但这确实取决于您如何使用它。如果您将大型 JSON 结构存储在其中,然后完全读取它仅基于 id 查找某个特定对象 - 显然,这比使用真正的数据库要花费更多的时间。
请注意,我提出的所有解决方案(AccountManager
、SharedPreferences
和 SQLite/Realm)都可以在一个应用程序中完美地协同工作。只需确保为给定问题选择适当的工具即可。
Jetpack DataStore 是一个新的、改进的数据存储解决方案,旨在取代 SharedPreferences。基于 Kotlin 协程和 Flow 构建,DataStore 提供了两种不同的实现方式:
数据以异步、一致和事务性的方式存储,克服了 SharedPreferences 大部分的缺点。
如果您目前正在使用 SharedPreferences 存储数据,请考虑迁移到 DataStore。
DataStore 的类型
DataStore 提供了两种不同的实现方式:
Preferences DataStore - 使用键存储和访问数据。这种实现不需要预定义模式,也不提供类型安全性。
Proto DataStore - 将数据存储为自定义数据类型的实例。这种实现需要使用协议缓冲区定义模式,但它提供了类型安全性。
SharedPreferences vs DataStore
SharedPreference 在 apply() 调用预定的 fsync() 期间会阻塞 UI 线程,常常成为 ANR 的来源。
SharedPreferences 会将解析错误作为运行时异常抛出。
在这两种实现中,DataStore 将首选项保存在文件中,并在 Dispatchers.IO 线程上执行所有数据操作。
如果有大量数据需要存储,那么不应该使用Shared Preferences,因为这样会很混乱。相反,您应该写入内部存储。以下是您的选项:
**Shared Preferences**
Store private primitive data in key-value pairs.
**Internal Storage**
Store private data on the device memory.
**External Storage**
Store public data on the shared external storage.
**SQLite Databases**
Store structured data in a private database.
**Network Connection**
Store data on the web with your own network server.
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
我找不到更好的方法来保存用户数据。SharedPreferences 就是为此目的而制作的。SharedPreferences 不应该阻止您的活动加载。因此,可能有其他降低性能的原因。
SharedPreferences
不符合您的需求。 - CommonsWare