HarmonyOS 鸿蒙Next 数据存储与本地数据库集成

HarmonyOS 鸿蒙Next 数据存储与本地数据库集成

数据存储与本地数据库集成

一、鸿蒙数据存储方式概述

鸿蒙OS提供了以下主要的数据存储方式:

  • 偏好存储(Preferences):用于存储简单的键值对数据,适合保存应用配置、用户设置等。
  • 文件存储:将数据以文件形式存储在设备的存储空间中,适合存储大文本、图片等文件。
  • 本地数据库(SQLite):使用轻量级数据库管理数据,适合处理结构化数据。

二、使用偏好存储保存配置信息

1. 基本用法

以下示例展示了如何使用偏好存储保存和读取用户设置:

import preferences from '@ohos.data.preferences';

@Entry
@Component
struct PreferencesExample {
  @State username: string = '';

  build() {
    Column() {
      TextField({ placeholder: '请输入用户名', text: this.username })
        .onChange((value) => {
          this.username = value;
        })
        .margin(16);
      Button('保存用户名')
        .onClick(() => {
          this.saveUsername();
        })
        .margin(16);
      Button('读取用户名')
        .onClick(() => {
          this.loadUsername();
        })
        .margin(16);
    }
  }

  saveUsername() {
    preferences.getPreferences('user_prefs').then((pref) => {
      pref.put('username', this.username);
      pref.flush();
    });
  }

  loadUsername() {
    preferences.getPreferences('user_prefs').then((pref) => {
      this.username = pref.get('username', '');
    });
  }
}

2. 解释

  • preferences.getPreferences('user_prefs'):获取或创建名为user_prefs的偏好文件。
  • pref.put('username', this.username):保存键值对数据。
  • pref.flush():将数据写入存储。
  • pref.get('username', ''):读取数据,第二个参数为默认值。

三、使用文件存储保存数据

1. 基本用法

以下示例展示了如何将文本数据保存到文件:

import file from '@ohos.file.fs';

@Entry
@Component
struct FileExample {
  @State content: string = '';

  build() {
    Column() {
      TextField({ placeholder: '请输入内容', text: this.content })
        .onChange((value) => {
          this.content = value;
        })
        .margin(16);
      Button('保存到文件')
        .onClick(() => {
          this.saveToFile();
        })
        .margin(16);
      Button('从文件读取')
        .onClick(() => {
          this.readFromFile();
        })
        .margin(16);
    }
  }

  saveToFile() {
    const path = '/data/accounts/account_0/appdata/com.example.fileexample/files/data.txt';
    file.writeText(path, this.content, (err) => {
      if (err) {
        prompt.showToast({ message: '保存失败:' + err.message });
      } else {
        prompt.showToast({ message: '保存成功' });
      }
    });
  }

  readFromFile() {
    const path = '/data/accounts/account_0/appdata/com.example.fileexample/files/data.txt';
    file.readText(path, (err, data) => {
      if (err) {
        prompt.showToast({ message: '读取失败:' + err.message });
      } else {
        this.content = data;
        prompt.showToast({ message: '读取成功' });
      }
    });
  }
}

2. 解释

  • file.writeText():将文本写入指定路径的文件。
  • file.readText():从指定路径的文件读取文本。
  • prompt.showToast():显示提示信息,便于用户了解操作结果。

四、集成本地数据库(SQLite)

1. 基本用法

以下示例展示了如何使用本地数据库存储和查询数据:

import rdb from '@ohos.data.rdb';

@Entry
@Component
struct DatabaseExample {
  @State users: { id: number; name: string }[] = [];
  @State username: string = '';
  private store: rdb.RdbStore;

  build() {
    Column() {
      TextField({ placeholder: '请输入用户名', text: this.username })
        .onChange((value) => {
          this.username = value;
        })
        .margin(16);
      Button('添加用户')
        .onClick(() => {
          this.insertUser();
        })
        .margin(16);
      Button('查询用户')
        .onClick(() => {
          this.queryUsers();
        })
        .margin(16);
      List() {
        ForEach(this.users, (user) => {
          Text(`ID: ${user.id}, Name: ${user.name}`).margin(8);
        });
      }
    }
  }

  aboutToAppear() {
    this.initDatabase();
  }

  initDatabase() {
    const config = {
      name: 'user.db',
      version: 1,
      onCreate: (db) => {
        db.executeSql('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)');
      },
    };
    rdb.getRdbStore(config).then((store) => {
      this.store = store;
    });
  }

  insertUser() {
    const values = { name: this.username };
    this.store.insert('users', values).then((id) => {
      prompt.showToast({ message: '用户添加成功,ID:' + id });
      this.username = '';
    });
  }

  queryUsers() {
    this.store.query('SELECT * FROM users').then((resultSet) => {
      const users = [];
      while (resultSet.goToNextRow()) {
        users.push({
          id: resultSet.getLong(resultSet.getColumnIndex('id')),
          name: resultSet.getString(resultSet.getColumnIndex('name')),
        });
      }
      this.users = users;
      resultSet.close();
    });
  }
}

2. 解释

  • rdb.getRdbStore(config):获取数据库实例,config包含数据库配置。
  • onCreate:数据库创建回调,用于创建表结构。
  • store.insert():向指定表插入数据,返回插入的记录ID。
  • store.query():执行查询语句,返回结果集ResultSet
  • resultSet.goToNextRow():遍历结果集中的每一行。
  • resultSet.getLong() / getString():获取指定列的数据。

五、处理异步操作和错误

1. 使用Promise处理异步

鸿蒙的数据存储API大多基于Promise,可以使用thencatch进行链式调用。

this.store.insert('users', values)
  .then((id) => {
    // 插入成功
  })
  .catch((error) => {
    // 处理错误
  });

2. 错误处理

在每个异步操作的catch中处理错误,避免应用崩溃。

this.store.query('SELECT * FROM users')
  .then((resultSet) => {
    // 处理结果
  })
  .catch((error) => {
    prompt.showToast({ message: '查询失败:' + error.message });
  });

六、实践案例:记事本应用的数据存储

1. 需求

创建一个简单的记事本应用,允许用户添加、查看和删除笔记,数据保存在本地数据库中。

2. 实现步骤

import rdb from '@ohos.data.rdb';

@Entry
@Component
struct NoteApp {
  @State notes: { id: number; content: string }[] = [];
  @State noteContent: string = '';
  private store: rdb.RdbStore;

  build() {
    Column() {
      TextField({ placeholder: '请输入笔记内容', text: this.noteContent })
        .onChange((value) => {
          this.noteContent = value;
        })
        .margin(16);
      Button('添加笔记')
        .onClick(() => {
          this.addNote();
        })
        .margin(16);
      List() {
        ForEach(this.notes, (note) => {
          Row() {
            Text(`ID: ${note.id}`).margin(8);
            Text(note.content).margin(8);
            Button('删除')
              .onClick(() => {
                this.deleteNote(note.id);
              })
              .margin(8);
          }
        });
      }
    }
  }

  aboutToAppear() {
    this.initDatabase();
  }

  initDatabase() {
    const config = {
      name: 'notes.db',
      version: 1,
      onCreate: (db) => {
        db.executeSql('CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT)');
      },
    };
    rdb.getRdbStore(config).then((store) => {
      this.store = store;
      this.loadNotes();
    });
  }

  addNote() {
    const values = { content: this.noteContent };
    this.store.insert('notes', values).then(() => {
      this.noteContent = '';
      this.loadNotes();
    });
  }

  loadNotes() {
    this.store.query('SELECT * FROM notes').then((resultSet) => {
      const notes = [];
      while (resultSet.goToNextRow()) {
        notes.push({
          id: resultSet.getLong(resultSet.getColumnIndex('id')),
          content: resultSet.getString(resultSet.getColumnIndex('content')),
        });
      }
      this.notes = notes;
      resultSet.close();
    });
  }

  deleteNote(id: number) {
    this.store.delete('notes', `id = ?`, [id]).then(() => {
      this.loadNotes();
    });
  }
}

3. 解释

  • store.delete():根据条件删除记录。
  • this.loadNotes():刷新笔记列表,确保界面显示最新数据。

七、优化数据存储和访问

1. 使用事务提高效率

对于多个数据库操作,可以使用事务提高效率和数据一致性。

this.store.runInTransaction(() => {
  // 执行一系列数据库操作
});

2. 参数化查询防止SQL注入

在执行SQL语句时,使用参数化查询,防止SQL注入攻击。

this.store.query('SELECT * FROM users WHERE name = ?', [this.username]);

八、总结

通过本文的学习,您应掌握了在鸿蒙OS中进行数据存储和本地数据库集成的基本方法,包括使用偏好存储保存简单数据、使用文件存储保存文本文件,以及使用本地数据库管理结构化数据。这些技能将帮助您开发功能丰富、数据持久化的应用程序,为用户提供更好的体验。


更多关于HarmonyOS 鸿蒙Next 数据存储与本地数据库集成的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 数据存储与本地数据库集成的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS(鸿蒙)Next在数据存储与本地数据库集成方面,主要依赖于其分布式数据管理和本地数据库框架来实现高效、安全的数据存储与访问。

鸿蒙系统提供了分布式数据管理功能,使得应用能够跨设备、跨用户进行数据同步和访问。这一功能通过统一的API接口,为应用开发者提供了简便的数据管理方式,无需关心底层数据同步的细节。

在本地数据库集成方面,鸿蒙系统内置了轻量级的本地数据库框架,支持SQL语句操作,方便开发者进行本地数据的存储、查询、更新和删除。这一框架还提供了事务管理、数据备份与恢复等功能,进一步增强了数据的可靠性和安全性。

对于应用开发者而言,只需按照鸿蒙系统的开发规范,使用相应的API接口进行数据操作,即可实现数据存储与本地数据库的集成。同时,鸿蒙系统还提供了丰富的开发工具和调试环境,方便开发者进行应用的开发和测试。

需要注意的是,随着鸿蒙系统的不断更新和升级,数据存储与本地数据库集成的具体实现方式可能会有所变化。因此,建议开发者在开发过程中及时关注鸿蒙系统的官方文档和更新信息,以确保应用的兼容性和稳定性。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,

回到顶部