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