HarmonyOS Next数据持久化主要包括用户首选项和关系型数据库。用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。
用户首选项
- 封装工具类用户初始化首选项和操作数据(
/src/main/ets/utils/PreferenceUtil.ts
)。
import preferences from '@ohos.data.preferences';
import { hilog } from '@kit.PerformanceAnalysisKit';
class PreferencesUtil {
prefMap: Map<string, preferences.Preferences> = new Map()
async loadPreferences(context, name: string) {
try {
const pref = await preferences.getPreferences(context, name)
this.prefMap.set(name, pref)
hilog.info(0x0000, 'preferences', '首选项实例加载成功');
} catch (err) {
hilog.info(0x0000, 'preferences', '首选项实例加载失败', JSON.stringify(err));
}
}
// 新增数据
async putPreferences(name: string, key: string, value: preferences.ValueType) {
try {
if (!this.prefMap.has(name)) {
hilog.info(0x0000, 'preferences', '未初始化首选项实例');
return
}
const pref = this.prefMap.get(name)
await pref.put(key, value)
await pref.flush()
hilog.info(0x0000, 'preferences', `首选项实例${name}写入数据${key}=${value}成功`);
} catch (e) {
hilog.info(0x0000, 'preferences', '首选项实例写入数据失败', JSON.stringify(e));
}
}
// 删除数据
async deletePreferences(name: string, key: string) {
try {
if (!this.prefMap.has(name)) {
hilog.info(0x0000, 'preferences', '未初始化首选项实例');
return
}
const pref = this.prefMap.get(name)
await pref.delete(key)
hilog.info(0x0000, 'preferences', `首选项实例${name}删除数据${key}成功`);
} catch (e) {
hilog.info(0x0000, 'preferences', '首选项实例删除数据失败', JSON.stringify(e));
}
}
// 查找数据
async getPreferences(name: string, key: string, defaultValue: preferences.ValueType) {
try {
if (!this.prefMap.has(name)) {
hilog.info(0x0000, 'preferences', '未初始化首选项实例');
return
}
const pref = this.prefMap.get(name)
const prefValue = await pref.get(key, defaultValue)
hilog.info(0x0000, 'preferences', `首选项实例${name}查找数据${key}=${prefValue}成功`);
return prefValue
} catch (e) {
hilog.info(0x0000, 'preferences', '首选项实例查找数据失败', JSON.stringify(e));
}
}
}
export default new PreferencesUtil() as PreferencesUtil
- 初始化首选项实例(
src/main/ets/entryability/EntryAbility.ets
)。
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
// 初始化首选项实例
await PreferenceUtil.loadPreferences(this.context, 'ThemePreferences')
}
关系型数据库
- 封装工具类初始化关系型数据库和操作数据(
/src/main/ets/utils/SqlUtil.ts
)。
import { relationalStore } from '@kit.ArkData';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import JueJinCommentItem from '../viewmodel/JueJinCommentItem'
import { util } from '@kit.ArkTS';
import { DateUtil } from '@pura/harmony-utils';
class JueJinSqlUtil {
private rdbStore?: relationalStore.RdbStore
private tableName: string = 'jue_jin_comment'
private tableColumns: string[] = [
'comment_id',
'avatar',
'grade',
'username',
'comment_time',
'comment_content',
'is_thumb',
'thumb_count',]
// 初始化sql
initCommentDB(context: common.BaseContext) {
const cTableSql = `CREATE TABLE IF NOT EXISTS jue_jin_comment (
comment_id TEXT PRIMARY KEY,
avatar TEXT NOT NULL,
grade INTEGER NOT NULL,
username TEXT NOT NULL,
comment_time TEXT NOT NULL,
comment_content TEXT NOT NULL,
is_thumb INTEGER NOT NULL,
thumb_count INTEGER NOT NULL
);`
relationalStore.getRdbStore(context, {
name: 'JueJinCommentSql.db',
securityLevel: relationalStore.SecurityLevel.S1
}, (err: BusinessError, data: relationalStore.RdbStore) => {
if (err) {
hilog.info(0x0000, 'commentDB', '初始化数据库失败')
return
}
data.executeSql(cTableSql)
this.rdbStore = data
hilog.info(0x0000, 'commentDB', 'jue_jin_comment表创建成功')
})
}
// 新增数据
addComment(commentContent: string): Promise<number> {
return this.rdbStore!.insert(this.tableName,数据)
}
// 删除数据(删除表字段id=commentId的记录)
deleteComment(commentId: string) {
let predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('comment_id', commentId)
this.rdbStore!.delete(predicates)
hilog.info(0x0000, 'commentDB', '表数据删除成功')
}
// 更新数据(点赞)
updateCommentThumb(commentId: string, isThumb: boolean, thumbCount: number) {
let predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('comment_id', commentId)
const value: relationalStore.ValuesBucket =
{ 'is_thumb': isThumb ? 0 : 1, 'thumb_count': isThumb ? thumbCount - 1 : thumbCount + 1 }
hilog.info(0x0000, 'commentDB', 'jue_jin_comment表数据更新成功')
return this.rdbStore!.update(value, predicates)
}
// 查询所有数据
async getComment(): Promise<JueJinCommentItem[]> {
let predicates = new relationalStore.RdbPredicates(this.tableName)
let result = await this.rdbStore!.query(predicates, this.tableColumns)
let arr: JueJinCommentItem[] = []
while (!result.isAtLastRow) {
result.goToNextRow()
arr.push() // 根据实际需求push
}
hilog.info(0x0000, 'commentDB', 'jue_jin_comment表数据查询成功')
return arr
}
}
export default new SqlUtil() as SqlUtil
- 初始化关系型数据库实例(
src/main/ets/entryability/EntryAbility.ets
)。
import SqlUtil from '../utils/SqlUtil'
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
// 初始化sql
JueJinSqlUtil.initCommentDB(this.context)
}