如何在HarmonyOS中进行本地数据存储?

如何在HarmonyOS中进行本地数据存储?

阅读 816
avatarAI BotBETA

在HarmonyOS中进行本地数据存储,你可以使用以下几种方法:

  1. 使用Preferences存储轻量级数据

    Preferences适用于存储轻量级的数据,如用户偏好设置等。你可以使用ohos.aafwk.ability.AbilityContext中的getPreferences方法来获取Preferences对象,然后进行数据的读写操作。

    // 获取Preferences对象
    Preferences preferences = this.getPreferences(Context.MODE_PRIVATE);
    
    // 存储数据
    preferences.putString("key", "value");
    preferences.apply();
    
    // 读取数据
    String value = preferences.getString("key", "defaultValue");
  2. 使用文件存储

    对于较大的数据集,你可以使用文件存储。HarmonyOS提供了文件访问的API,允许你读写文件。

    // 获取文件路径
    File file = new File(this.getFilesDir(), "filename.txt");
    
    // 写入数据到文件
    try (FileOutputStream fos = new FileOutputStream(file)) {
        fos.write("Hello, HarmonyOS!".getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    // 从文件读取数据
    try (FileInputStream fis = new FileInputStream(file)) {
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        String content = new String(buffer);
        System.out.println(content);
    } catch (IOException e) {
        e.printStackTrace();
    }
  3. 使用SQLite数据库存储结构化数据

    SQLite是一个轻量级的嵌入式数据库,适用于存储结构化数据。HarmonyOS提供了SQLite的封装类,方便你进行数据库操作。

    // 创建SQLiteOpenHelper对象
    SQLiteOpenHelper helper = new SQLiteOpenHelper(this, "dbname.db", null, 1) {
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE tablename (id INTEGER PRIMARY KEY, name TEXT)");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS tablename");
            onCreate(db);
        }
    };
    
    // 获取SQLiteDatabase对象并插入数据
    SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("name", "HarmonyOS");
    db.insert("tablename", null, values);
    
    // 查询数据
    Cursor cursor = db.query("tablename", null, null, null, null, null, null);
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        System.out.println(name);
    }
    cursor.close();

选择哪种方法取决于你的具体需求,如数据的类型、大小以及访问频率等。

1 个回答

在 HarmonyOS 中可以使用以下方式进行本地数据存储:

  1. LocalStorage 是 ArkTS 为构建页面级别状态变量提供存储的内存内“数据库”。参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
  2. AppStorage 是应用全局的 UI 状态存储,是和应用的进程绑定的,由 UI 框架在应用程序启动时创建,为应用程序 UI 状态属性提供中央存储。参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
  3. PersistentStorage 是应用程序中的可选单例对象。此对象的作用是持久化存储选定的 AppStorage 属性,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
  4. 如果需要将内存中的数据通过文件或数据库的形式保存到设备上可以使用用户首选项、键值型数据库、关系型数据库。参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
  5. json 文件可以放在 rawfile 目录下,可调用 getRawFileContent 或 getRawFileContentSync 接口获取 json 文件内容,并读为 string。参考代码如下:
import { Context } from '@ohos.abilityAccessCtrl';
import buffer from '@ohos.buffer';
@Entry
@Component
struct Index {
  private context:Context = getContext(this) ;
  private str:string = ''
  getRawFile(): ESObject{
    //调用 getRawFileContent 接口获取 json 文件内容,并读为 string
    getContext(this).resourceManager.getRawFileContent("data.json",(err,data)=>{
      try {
        this.str = buffer.from(data.buffer).toString();
        console.info(JSON.stringify(this.str))
      }catch (e){
        console.info(JSON.stringify(e))
      }
    })
    //也可以调用 getRawFileContentSync 接口获取 json 文件内容,并读为 string
    try {
      let data: Uint8Array= this.context.resourceManager.getRawFileContentSync("data.json");
      this.str = buffer.from(data.buffer).toString();
    } catch (e) {
      console.info(JSON.stringify(e))
    }
    // string 转为 ESObject
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进