当前位置:   article > 正文

Android开发笔记(一百七十八)更安全的数据仓库DataStore_android有数据仓储吗

android有数据仓储吗

虽然SharedPreferences用起来比较方便,但是在一些特殊场景会产生问题。比如共享参数保存的数据较多时,初始化共享参数会把整个文件加载进内存,加载耗时可能导致主线程堵塞。又如调用apply方法保存数据时,频繁apply容易导致线程等待超时。为此Android官方推出了数据仓库DataStore,并将其作为Jetpack库的基础组件。DataStore提供了两种实现方式,分别是Preferences DataStore 和Proto DataStore,前者采用键值对存储数据,后者采用自定义类型存储数据,其中Preferences DataStore可以直接替代SharedPreferences。
由于DataStore并未集成到SDK中,而是作为第三方框架提供,因此首先要修改模块的build.gradle文件,往dependencies节点添加下面两行配置,表示导入指定版本的DataStore库:

  1. implementation "androidx.datastore:datastore-preferences:1.0.0"
  2. implementation "androidx.datastore:datastore-preferences-rxjava2:1.0.0"

数据仓库的用法类似于共享参数,首先要指定仓库名称,并创建仓库实例,示例代码如下:

  1. private RxDataStore<Preferences> mDataStore; // 声明一个数据仓库实例
  2. private DatastoreUtil(Context context) {
  3.     mDataStore = new RxPreferenceDataStoreBuilder(context.getApplicationContext(), "datastore").build();
  4. }
  5. // 获取数据仓库工具的实例
  6. public static DatastoreUtil getInstance(Context context) {
  7.     if (instance == null) {
  8.         instance = new DatastoreUtil(context);
  9.     }
  10.     return instance;
  11. }

其次从仓库实例中获取指定键名的数据,下面的代码模板演示了如何从数据仓库中读取字符串值:

  1. // 获取指定名称的字符串值
  2. public String getStringValue(String key) {
  3.     Preferences.Key<String> keyId = PreferencesKeys.stringKey(key);
  4.     Flowable<String> flow = mDataStore.data().map(prefs -> prefs.get(keyId));
  5.     try {
  6.         return flow.blockingFirst();
  7.     } catch (Exception e) {
  8.         return "";
  9.     }
  10. }

往仓库实例写入指定键值的话,下面的代码模板演示了如何将字符串值写入数据仓库:

  1. // 设置指定名称的字符串值
  2. public void setStringValue(String key, String value) {
  3.     Preferences.Key<String> keyId = PreferencesKeys.stringKey(key);
  4.     Single<Preferences> result = mDataStore.updateDataAsync(prefs -> {
  5.         MutablePreferences mutablePrefs = prefs.toMutablePreferences();
  6.         mutablePrefs.set(keyId, value);
  7.         return Single.just(mutablePrefs);
  8.     });
  9. }

前面把数据仓库的初始化以及读写操作封装在DatastoreUtil中,接下来通过该工具类即可方便地访问数据仓库了。往数据仓库保存数据的代码示例如下:

  1. // 从数据仓库中读取信息
  2. private void readDatastore() {
  3.     DatastoreUtil datastore = DatastoreUtil.getInstance(this); // 获取数据仓库工具的实例
  4.     String desc = "数据仓库中保存的信息如下:";
  5.     desc = String.format("%s\n %s为%s", desc, "姓名",
  6.             datastore.getStringValue("name"));
  7.     desc = String.format("%s\n %s为%d", desc, "年龄",
  8.             datastore.getIntValue("age"));
  9.     desc = String.format("%s\n %s为%d", desc, "身高",
  10.             datastore.getIntValue("height"));
  11.     desc = String.format("%s\n %s为%.2f", desc, "体重",
  12.             datastore.getDoubleValue("weight"));
  13.     desc = String.format("%s\n %s为%b", desc, "婚否",
  14.             datastore.getBooleanValue("married"));
  15.     desc = String.format("%s\n %s为%s", desc, "更新时间",
  16.             datastore.getStringValue("update_time"));
  17.     tv_data.setText(desc);
  18. }

从数据仓库获取数据的代码示例如下:

  1. DatastoreUtil datastore = DatastoreUtil.getInstance(this); // 获取数据仓库工具的实例
  2. datastore.setStringValue("name", name); // 添加一个名叫name的字符串
  3. datastore.setIntValue("age", Integer.parseInt(age)); // 添加一个名叫age的整数
  4. datastore.setIntValue("height", Integer.parseInt(height)); // 添加一个名叫height的整数
  5. datastore.setDoubleValue("weight", Double.parseDouble(weight)); // 添加一个名叫weight的双精度数
  6. datastore.setBooleanValue("married", isMarried); // 添加一个名叫married的布尔值
  7. datastore.setStringValue("update_time", DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss"));

运行测试App,先打开记录保存页面,填写数据后点击保存按钮,此时保存界面如下图所示。


然后打开记录获取界面,看到记录获取结果如下图所示,说明成功实现了数据仓库的读写功能。

 

 


点此查看Android开发笔记的完整目录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/309382?site
推荐阅读
相关标签
  

闽ICP备14008679号