首页 > 数据库 >ArkTS本地化数据库SqlLight使用,鸿蒙NEXT星河版API(11)

ArkTS本地化数据库SqlLight使用,鸿蒙NEXT星河版API(11)

时间:2024-06-16 21:29:26浏览次数:12  
标签:11 ArkTS const resultSet await 星河 predicates id store

RelationalStore提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。

  • 谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。

  • 结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。

一、定义存储图片和视频关键信息的接口

// 图片和视频文件关键信息。(PhotoKeys)
export interface PrivacyPhotoDBInfo extends ValuesBucket {
  id: number | null // 新增时 id 为 null ,自动生成自增 id
  mediaUri: string // 文件uri
  privacyUri: string // 沙箱文件uri(Image可以渲染uri)
  media_type: number // 媒体文件类型
  date_added: number // 添加日期
}

二、sql语句准备创建数据库

private store: relationalStore.RdbStore | null = null
  private tableName = 'PRIVACY_PHOTO'
  // 创建数据库的语句
  private sqlCreate = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        mediaUri TEXT,
        privacyUri TEXT,
        media_type INTEGER,
        date_added INTEGER
      )`

三、创建数据库

  async getStoreInstance() {
    // 如果数据库已存在,直接退出
    if (this.store) {
      return this.store
    }
    // 存储 store 方便下次直接获取
    this.store = await relationalStore.getRdbStore(getContext(), {
      name: this.tableName + '.db', // 数据库名称
      securityLevel: relationalStore.SecurityLevel.S4 // 安全等级
    })
    this.store.executeSql(this.sqlCreate)
    // 返回 store 实例
    return this.store
  }

四、数据库新增数据

  // 新增
  async insert(value: PrivacyPhotoDBInfo) {
    const store = await this.getStoreInstance()
    const rowId = await store.insert(this.tableName, value)
    return rowId > -1 ? Promise.resolve(rowId) : Promise.reject('insert error')
  }

五、数据库批量新增数据

  // 批量新增
  async batchInsert(values: PrivacyPhotoDBInfo[]) {
    const store = await this.getStoreInstance()
    const rowId = await store.batchInsert(this.tableName, values)
    return rowId ? Promise.resolve(rowId) : Promise.reject('batchInsert error')
  }

六、更新数据

  // 更新
  async update(item: PrivacyPhotoDBInfo) {
    if (!item.id) {
      return Promise.reject('id error')
    }
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', item.id)
    const rowCount = await store.update(item, predicates)
    return rowCount ? Promise.resolve(rowCount) : Promise.reject('update error')
  }

七、删除数据

  // 删除
  async delete(id: number) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', id)
    const rowCount = await store.delete(predicates)
    return rowCount ? Promise.resolve(rowCount) : Promise.reject('delete error')
  }

八、批量删除数据

  // 批量删除
  async batchDelete(ids: number[]) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.in('id', ids)
    const rowCount = await store.delete(predicates)
    return rowCount ? Promise.resolve(rowCount) : Promise.reject('delete error')
  }

九、查询数据

// 查询
  async query(id?: number) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    // 添加日期倒序排列
    predicates.orderByDesc('date_added')
    // 如果有 id
    if (id) {
      predicates.equalTo('id', id)
    }
    const resultSet = await store.query(predicates)
    const list: PrivacyPhotoDBInfo[] = []
    while (resultSet.goToNextRow()) {
      // 获取数据
      const data: PrivacyPhotoDBInfo = {
        id: resultSet.getLong(resultSet.getColumnIndex('id')),
        mediaUri: resultSet.getString(resultSet.getColumnIndex('mediaUri')),
        privacyUri: resultSet.getString(resultSet.getColumnIndex('privacyUri')),
        media_type: resultSet.getLong(resultSet.getColumnIndex('media_type')),
        date_added: resultSet.getLong(resultSet.getColumnIndex('date_added')) * 1000,
      }
      // 追加到数组中
      list.push(data)
    }
    // 释放资源
    resultSet.close()
    return list
  }

标签:11,ArkTS,const,resultSet,await,星河,predicates,id,store
From: https://blog.csdn.net/xp1870069025/article/details/139703896

相关文章

  • [240615] X-CMD 发布 v0.3.11,增加对 elvish 的支持
    目录X-CMD发布v0.3.11,增加对elvish的支持,并优化对nushell,fish,xonsh,tcsh的支持✨co模块-copilot✨elv模块✨hubX-CMD发布v0.3.11,增加对elvish的支持,并优化对nushell,fish,xonsh,tcsh的支持✨co模块-copilot新增功能:现在可以在--co|,子命......
  • 6.11
    今日总结代码如下packagecom.app.chapter04;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroi......
  • C++题解—1140—亲密数对(东方博宜OJ)
    题目描述:键盘输入 N,N 在2至 2000之间,求 2 至 N 中的亲密数对,就是A的因子和等于B,B的因子和等于A ,且A≠B。如 48和 75是亲密数对。48的因子和为2+3+4+6+8+12+16+24=75 ,而 75的因子和3+5+15+25=48 。输入:只有一行,为一个整数 N( 2≤N≤2000 )。输出:输出......
  • Win11专业版系统密钥
    Windows11专业版(Windows11Pro)是微软发布的Windows11操作系统的一个版本,面向专业用户和企业环境。与Windows11家庭版(Home)相比,专业版提供了更多高级功能和安全选项,适合需要更高效管理和安全保障的用户。以下是Windows11专业版的一些主要特点:主要功能和特点BitLocker......
  • Win11专业工作站版系统密钥
    Windows11专业工作站版(Windows11ProforWorkstations)是微软为高端硬件和专业用户设计的操作系统版本。它在标准版Windows11的基础上进行了多项增强,以满足工作站级别计算需求。以下是其主要特点:性能优化:支持多达4个CPU和6TB内存,相比普通版本有更强的硬件支持。包含更......
  • 洛谷 P1122 最大子树和
    题目链接:最大子树和思路    由于可以无限剪枝,所以假设以节点1为根,并删去所有美丽质数小于0的子树,又考虑到可能会出现根节点为负数,导致可能会只留下子树而把节点1为根节点的其他部分扔掉,所以需要dp数组记录,dp[i]为以节点i为根节点能得到的最大的美丽指数,贪心将节点i的子......
  • 山东大学软件学院2024年项目实训-11
    队友合代码的时候用她的电脑生成PPT功能会报500错误,说layout为空,加入判断是否为空的逻辑后导致结尾页识别不了了,参看日志发现可能是直接按照内容页判断的,判断不出就自行创建了一页幻灯片,这样显然是不对的。2024-06-16T13:06:42.528+08:00DEBUG6172---[PPT_project_backend......
  • 代码随想录算法训练营第五十九天 | 115.不同的子序列、583. 两个字符串的删除操作、72
    115.不同的子序列题目链接:代码随想录视频讲解:动态规划之子序列,为了编辑距离做铺垫|LeetCode:115.不同的子序列_哔哩哔哩_bilibili解题思路1.dp[i][j]  为在s的前i个元素(即s[0,i-1])(以i-1结尾)中,有多少个t[0,j-1]匹配(以t[j -1]为结尾)2.递推公式//如果......
  • 洛谷 P1162 填涂颜色
    题目链接:填涂颜色思路代码#include<bits/stdc++.h>usingnamespacestd;constintN=30+10;#definelllonglongintmp[N][N],dir[5][2]={{1,0},{0,1},{-1,0},{0,-1}},n;boolvis[N][N];boolcheck(intx,inty){returnx>=......
  • 【LeetCode最详尽解答】11-盛最多水的容器 Container-With-Most-Water
    欢迎收藏Star我的MachineLearningBlog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star,有问题可以随时与我交流,谢谢大家!链接:11-盛最多水的容器直觉这个问题可以通过可视化图表来理解和解决。通过图形化这个问题,可以简化解决过程。......