HarmonyOS学习之路--数据持久化篇

数据持久化

应用在使用过程中会产生各种数据.数据放在内存中当应用重启后就会丢失.实现数据持久化的两种方式:用户首选项,关系型数据库

用户首选项

用户首选项为应用提供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文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值