这是android中Shared Preferences
存储数据的最佳替代方法,如果我想读取数据并再次保存一些更改。
数据可以是用户的配置文件,json响应或任何对象。
当我存储大量数据时,我正在搜索Reda / Write数据的其他耗时较少的选项。
目前我的应用程序需要x毫秒才能从活动A转到活动B.
我可以减少这个时间吗?
答案 0 :(得分:18)
如果不深入了解您的用例,很难向您推荐任何内容。
SharedPreferences
可能是一个不错的选择。SharedPreferences
并改为AccountManager
。OkHttp
对此有很好的支持。说到加载时间 - SharedPreferences
一般来说非常快,但这实际上取决于你如何使用它。如果你在其中存储大的JSON结构,那么完全读取它只是为了找到一些基于id的特定对象 - 显然它比使用真实数据库需要更多的时间。
请注意,我提出的所有解决方案(AccountManager
,SharedPreferences
和SQLite / Realm)都可以在一个应用中完美地互相协作。只需确保为给定问题选择合适的工具。
答案 1 :(得分:2)
如果您要存储大量数据,那么您不应该使用共享首选项,因为它可能会变得混乱。相反,您应该写入内部存储。您可以选择以下选项:
**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.
最后三个是最难的,但前两个很容易。如果您在共享首选项中有太多数据,那么如何存储到内部存储:
注意:当用户卸载您的应用程序时,将删除这些文件。 来自docs:
创建私有文件并将其写入内部存储:
<强> 1。使用文件名和操作名调用openFileOutput() 模式。强>
<强> 2。这将返回FileOutputStream。
第3。使用write()写入文件。
<强> 4。用close()关闭流。
例如:
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
检索数据也非常简单:
<强> 1。调用openFileInput()并将其传递给要读取的文件的名称。这个 返回一个FileInputStream。
<强> 2。使用read()从文件中读取字节。
第3。然后用close()关闭流。
共享首选项可以存储简单的键值对,如高分,用户设置等。如果要保存用户键入的文章,可以使用外部或内部存储。
如果有帮助,请告诉我,
Ruchir
答案 2 :(得分:1)
如果您正在寻找自动备份危险的替代方法有一种方法可以从autoBackup功能中排除您使用的特定SharedPrefs - 它是通过在xml文件中声明排除标记,然后使用清单的应用程序标记下的android:fullBackupContent属性引用它来实现的。 通过这样做,您仍然可以支持自动备份功能,而无需担心存储在Google云端硬盘云上的敏感信息。
好参考: https://developer.android.com/guide/topics/data/autobackup.html https://www.youtube.com/watch?v=HXacyy0HSW0
答案 3 :(得分:1)
Jetpack DataStore 是一种经过改进的新数据存储解决方案,旨在替代SharedPreferences。以Kotlin协程和Flow为基础,DataStore提供了两种不同的实现:
异步,一致和事务性地存储数据,克服了SharedPreferences的大多数缺点。
如果您当前正在使用SharedPreferences来存储数据,请考虑迁移到DataStore。
数据存储的类型
DataStore提供两种不同的实现:
首选项数据存储 –使用键存储和访问数据。此实现不需要预定义的架构,并且不提供类型安全性。
Proto DataStore –将数据存储为自定义数据类型的实例。此实现要求您使用协议缓冲区定义架构,但它提供类型安全性。
SharedPreferences与DataStore
SharedPreference阻止了由apply()调度的待处理fsync()调用上的UI线程,通常成为ANR的来源。
SharedPreferences抛出分析错误作为运行时异常。
在这两种实现中,DataStore都将首选项保存在文件中,并在Dispatchers.IO线程上执行所有数据操作。
答案 4 :(得分:0)
我找不到更好的方法来保存用户的数据。 SharedPreferences正是为此目的而制作的。并且SharedPreferences不应该阻止您的活动加载。所以可能会有其他因素降低你的表现。
答案 5 :(得分:0)
您还可以使用更易于使用的Hawk库。