前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发笔记(一百七十八)更安全的数据仓库DataStore

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

作者头像
aqi00
发布2022-01-05 14:19:47
8650
发布2022-01-05 14:19:47
举报

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

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

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

private RxDataStore<Preferences> mDataStore; // 声明一个数据仓库实例

private DatastoreUtil(Context context) {
    mDataStore = new RxPreferenceDataStoreBuilder(context.getApplicationContext(), "datastore").build();
}

// 获取数据仓库工具的实例
public static DatastoreUtil getInstance(Context context) {
    if (instance == null) {
        instance = new DatastoreUtil(context);
    }
    return instance;
}

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

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

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

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档