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

Posted aqi00

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发笔记(一百七十八)更安全的数据仓库DataStore相关的知识,希望对你有一定的参考价值。

虽然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开发笔记的完整目录

以上是关于Android开发笔记(一百七十八)更安全的数据仓库DataStore的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Android开发笔记(一百七十六)借助FileProvider发送彩信

Android开发笔记(一百七十六)借助FileProvider发送彩信

Android开发笔记(一百七十六)借助FileProvider发送彩信

Android开发笔记(一百七十五)利用Room简化数据库操作