赞
踩
虽然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,先打开记录保存页面,填写数据后点击保存按钮,此时保存界面如下图所示。
然后打开记录获取界面,看到记录获取结果如下图所示,说明成功实现了数据仓库的读写功能。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。