用户首选项

  • 用户首选项(Preference)为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据。
  • 轻量化数据指的是结构简单,能够用Key-Value表示,同时占用内存小的数据

image.png

  1. 导入首选项模块
    1
    import dataPreference from '@ohos.data.preferences'
  2. 获取首选项实例,读取指定文件
    1
    2
    3
    4
    5
    6
    7
    datePreference.getPreferences(this.context, 'MyAppPreferences')//UIAbility和Preferences实例名称
    .then(preferences => {
    //获取成功
    })
    .catch(reason => {
    //获取失败
    })
  3. 数据操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 3.1 写入数据,如果已经存在则覆盖,可利用.has()判断是否存在
    Preferences.put('key', val)
    .then(() => preferences.flush()) //刷到磁盘
    .catch(reason => {}) //异常处理
    // 3.2 删除数据
    preferences.delete('key')
    .then(() => {})
    .catch(reason => {})
    // 3.3 查询数据
    preferences.get('key', 'defaultValue')
    .then(value => console.log('查询成功'))
    .catch(reason => console.log('查询失败'))

    说明:
    Key为string类型,要求非空且长度不超过80字节
    Value可以是string、number、boolean以及以上类型数组,大小不超过8192字节
    数据量建议不超过一万条

加载实例

image.png

  • 上图为异步写法

image.png

  • 上图为同步写法,定义方法为async,然后在promise值前加上await,等待promise结果。

image.png

  • 如果写在其他文件记得导出

image.png

  • 在启动应用时加载数据,在EntryAbility.ts文件中的onCreate()钩子当中添加
  • 同时加上asyncawait同步操作

读写实例

image.png

  • 写入方法的参数包括Preference实例名称、Keyvalue
  • 先判断是否存在,然后写入数据
  • 等待刷盘
  • 也可以添加try catch获取异常

image.png

  • 读取方法的参数包含Preference实例名称、Key和默认值defaultValue
  • 先判断是否存在,再读取数据
  • 直接return返回数据
1
2
3
4
5
6
7
8
//在打开页面时读取数据
async aboutToAppear(){
this.fontSize = await PreferencesUtil.getPreferenceValue('MyPreferences', 'IndexFontSize', 16) as number
//as number 的作用是指定返回值为数字
}//写为同步操作

//写入数据
PreferencesUtil.putPreferenceValue('MyPreferences', 'IndexFontSize', val)
  • 在预览器不能使用preference,所以需要使用鸿蒙设备或者模拟器打开预览。

关系型数据库

  • 关系型数据库(RDB)是基于SQLite组件提供的本地数据库,用于管理应用中的结构化数据。例如记账本、备忘录。

初始化数据库

  1. 导入关系型数据库模块
1
import relationalStore from '@ohos.data.relationalStore';
  1. 初始化数据库表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 2.1 rdb配置
const config = {
name: 'MyApplication.db', //数据库文件名
securityLevel: relationalStore.SecurityLevel.S1 //数据库安全级别
}
// 2.2 初始化表的SQL
const sql = 'CREATE TABLE IF NOT EXISTS TASK (
ID INTEGER PRIMARY KEY,
NAME TEXT NOT NULL,
FINISHED bit
)'
// 2.3 获取rdb
relationalStore.getRdbStore(this.context, config, (err, rdbStore) => {
// 2.4 执行sql,后续的增删改查都是使用rdbStore对象
if(err){
//错误日志
return
}
rdbStore.executeSql(sql)
})
  • 为了方便使用,可以将rdbStore添加到成员变量当中

增、删、改数据

  1. 新增数据
1
2
3
4
// 1.1 准备数据
let task = {id: 1, name: '任务1', finished: false};
// 1.2 新增
this.rdbStore.insert(this.tableName, task)

image.png

  • 将返回值设定为promise,是个id,这样就可以直接使用来调取这个数据了。
  1. 修改
1
2
3
4
5
6
7
// 2.1 要更新的数据
let task = {'finished': true};
// 2.2 查询条件,RdbPredicates就是条件谓词
let predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('ID', id)
// 2.3 执行更新
this.rdbStore.update(task, predicates)

image.png

  • 同样是返回一个promise,让调用的地方去处理
  1. 删除
1
2
3
4
5
// 3.1 查询条件
let predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('ID', id)
// 3.2 执行删除
this.rdbStore.delete(predicates)

image.png

  • 与修改方法差不多

查询数据

  1. 查询数据
1
2
3
4
// 1.1 查询条件
let predicates = new relationalStore.RdbPredicates(this.tableName)
// 1.2 执行查询
let result = await this.rdbStore.query(predicates, ['ID', 'NAME', 'FINISHED'])
  1. 解析结果
1
2
3
4
5
6
7
8
9
10
11
12
13
// 2.1 准备数组保存结果
let tasks: any[] = []
// 2.2 循环遍历结果集,判断是否结果是否遍历到最后一行
while(!result.isAlLastRow){
//指针移动到下一行数据,默认在-1行
result.goToNextRow()
//根据字段名获取字段index,从而获取字段值
let id = result.getLong(result.getColumnIndex('ID'))
let name = result.getString(result.getColumnIndex('NAME'))
let finished = result.getLong(result.getColumnIndex('FINISHED'))
task.push({id, name, finished: !!finished}) //加入到数组当中
//传入的finished是数字型,通过两次取反可以变成布尔型
}

image.png

  • 最后return数组,是个promise