数据持久化
应用在使用过程中会产生各种数据.数据放在内存中当应用重启后就会丢失.实现数据持久化的两种方式:用户首选项,关系型数据库
用户首选项
用户首选项为应用提供Key-Value键值型的数据处理能力.支持应用持久化轻量级数据(结构简单,占用空间少)
使用用户首选项步骤
创建用户首选项实例.一个应用内部可以创建多个用户首选项实例,在应用的不同模块里用不同的实例,避免相互之间干扰.每一个用户首选项的实例都对应应用沙箱内的一个持久化文件.当调用用户首选项接口进行数据读写,就会操作那个持久化文件.从而实现对数据的持久化.
获取首选项实例需要读取磁盘上那个持久化文件.这是IO操作比较耗时因此也是一个异步事件.因此调用getPreferences不会立刻返回Preference对象,而是给promise.
1.导入首选项模块
import preference from '@ohos.data.preferences'
2.获取首选项实例(一般放在onCreate中)
preference.getPreferences(this.context,'MyAppPreferences')//第二个参数是这个Preferences实例名称.这个方法拿到的是一个promise
.then(preferences =>{// 获取成功
})
.catch(reason =>{
// 获取失败
})
3.数据操作
// 3.1 put向磁盘写入数据,如果已经存在则会覆盖,可利用,has()判断是否存在
preferences.put( 'key', val)
.then(() => preferences.flush()) //刷到磁盘
.catch(reason => {}) // 处理异常
// 3.2.删除数据
preferences.delete( 'key')
.then(() => {}) .catch (reason => {})
// 3.3.查询数据 一般放在aboutToAppear中
preferences.get( 'key', 'defaultValue') //key存在返回key对应的值否则返回默认值defaultValue
.then(value => console.log('查询成功'))
.catch(reason => console.log('查询失败'))
Key为string类型,要求非空且长度不超过80字节.Key为string类型,要求非空且长度不超过80字节大小不超过8192字节 数据量建议不超过一万条
关系型数据库
关系型数据库(RDB)是基于SQLite组件提供的本地数据库(这种数据库不需要经过网络请求,直接在应用内部),用于管理应用中的结构化数据.
每一个数据库都有一个自己的数据库文件(在应用沙箱中)一个应用内部可以创建多个数据库,因此有多个数据库文件,操作关系型数据库时,可以直接调用ArkTS提供的数据操作接口,完成对数据库文件的读写操作,实现数据持久化.
初始化数据库
1.导入关系型数据库模块
import relationalStore from '@ohos.data.relationalstore';
2.初始化数据库.创建表
// 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.利用rdbStore执行Sql,后续的所有增删改查都是使用rdbStore对象
rdbStore.executeSql(sql)
})
rdbStore中提供了常见的增删改方法,即可以不写sql语句
增删改数据
1.新增数据
// 1.1.准备数据
let task = {id: 1,name:'任务1',finished: false};
// 1.2.新增
this.rdbStore.insert(this.tableName, task)//返回值是Promise,在Promise的回调函数中得到的是id
2.修改
// 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)
3.删除
// 3.1.查询条件
let predicates = new relationalStore.RdbPredicates(this. tableName)
predicates.equalTo('ID',id)
// 3.2.执行删除
this.rdbStore.delete(predicates
查询数据
1.查询数据
// 1.1.查询条件
let predicates = new relationalStore.RdbPredicates(this.tableName)
// 1.2.执行查询
let result= await this.rdbStore.query(predicates, ['ID', 'NAME','FINISHED'])
返回的是resultset的结果集,因此要从这个结果集中解析数据
2.解析结果//2.1.准备数组保存结果,接收结果集中的每一行数据
let tasks: any[]=[]
// 2.2.循环遍历结果集,判断结果是否遍历到最后一行
while (!result.isAtLastRow){
// 指针移动到下一行数据
result.goToNextRow()
//根据字段名获取字段index,从而获取字段值
let id = result.getLong(result.getColumnIndex('ID'));//列也有编号,从0开始.取数字,布尔值用getLong.但两个!!把数字类型转布尔
let name = result.getString(result.getColumnIndex('NAME'));//取字符串,getString
tasks.push({id, name})
}
result对象会给结果集的每一行数据进行编号,从0开始.result对象内部有一个指针,指针指向哪一行就读取哪一行数据.指针初始指向-1即表头.
注:在ts文件中无法导入ets文件