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开发笔记(一百七十八)更安全的数据仓库DataStore的主要内容,如果未能解决你的问题,请参考以下文章
Android开发笔记(一百七十八)更安全的数据仓库DataStore
Android开发笔记(一百七十八)更安全的数据仓库DataStore
Android开发笔记(一百七十六)借助FileProvider发送彩信
Android开发笔记(一百七十六)借助FileProvider发送彩信