鸿蒙开发的Preferences是一种轻量级数据存储方式,类似于安卓开发中的SharedPreferences。信息在文件中是以key-value方式存储的,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<preferences version="1.0">
  <string key="in_net">xxxxx</string>
  <string key="year">2018</string>
  <string key="sex"></string>
  <string key="sign">xxxxxx</string>
  <string key="dept">xxxx</string>
  <string key="stu_id">xxxxx</string>
  <string key="major">计算机科学与技术</string>
  <string key="name">xxxxxx</string>
</preferences>

1 使用方式

1.1 创建数据库

  通过数据库操作的辅助类可以获取到要操作的Preferences实例,用于进行数据库的操作:

DatabaseHelper databaseHelper = new DatabaseHelper(context);
Preferences preferences = databaseHelper.getPreferences(name);

  name表示文件的名称,如果已经存在该文件则可以进行读操作,否则新建一个文件。

1.2 读操作

String x = preferences.getString(String key, int defValue);

  此外还有getInt和getFloat等多种方法。

1.3 写操作

preferences.putString(key, value).flushSync();

  其中flushSync将Preferences实例同步写入文件,此外还有异步写入:flush。

2 坑

2.1 读写时context的选择

  场景:我在MainAbility中创建了新的文件user_info,现在需要在UserAbility中进行访问,如果两个Ability中在创建Preferences实例时均采用getContext()方式,即:

DatabaseHelper databaseHelper = new DatabaseHelper(getContext());
Preferences preferences = databaseHelper.getPreferences(name);

  那么最终结果是:在UserAbility中不能访问到数据,这里需要注意的是:访问时传入的Context与创建时传入的Context必须一致!!
  因此解决办法有两个:一是直接使用getApplicationContext(),二是在第三个Ability中定义一个公共静态Context。

Context context = getApplicationContext();
Context context = MAbility.mContext;

2.2 应用重新启动后相关文件被删除

  场景:在第一次启动应用时,输入了相关账号和登录密码,并利用Preferences将相关登录信息持久化地存储到设备中。第二次在该设备上运行同一应用时会判断是否存在该文件,如果存在就直接跳转到登录后的界面,否则需要重新登录。但调试时发现:每次重新启动应用后相关文件都被删除了。
  原因:DevEco每次重新启动应用时都是卸载了之前的应用后重新部署,因此相关信息会被清除。
  解决:
  DevEco中打开Run->Edit Configuration,勾选Replace existing application选项。
在这里插入图片描述

3 Preferences的封装

package com.example.ncepu.Utils;

import com.example.ncepu.MyApplication;
import ohos.app.Context;
import ohos.data.DatabaseHelper;
import ohos.data.preferences.Preferences;

public class PreferenceUtils {

    public static PreferenceUtils preferenceUtils = null;
    private static String name = "user_info";

    public static PreferenceUtils getInstance() {
        if(preferenceUtils == null) {
            preferenceUtils = new PreferenceUtils();
        }
        return preferenceUtils;
    }

    public Preferences getApplicationPref(Context context) {
        DatabaseHelper databaseHelper = new DatabaseHelper(context);
        return databaseHelper.getPreferences(name);
    }

    public void putString(String key, String value) {

        preferenceUtils.getApplicationPref(MyApplication.context).putString(key, value).flushSync();
    }

    public String getString(String key, String defValue) {
        return preferenceUtils.getApplicationPref(MyApplication.context).getString(key, defValue);
    }
}

使用:

PreferenceUtils.getInstance().putString("id", _id);
String id = PreferenceUtils.getInstance().getString("id", "");

  Android开发中SharedPreferences的使用请参考:安卓利用SharedPreferences保存登录信息,防止重复登录

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐