我看好多博客都是copy官网API的,太官方啦!看这里吧,都是面试加分项
一、PersistentStorage
参考官网文档
1, 优点:
- persistentStorage适用于与 UI 状态联动的轻量的数据场景,比如主题、APP设置等这些数据场景
- 它与 AppStorage绑定后,数据是自动双向同步。
- persistentStorage 是 基于 Preferences 封装的高级 API,它实现了AppStorage 状态的自动同步。AppStorage数据发生变更时,通过监听状态变更自动触发 preferences.put() 和 preferences.get() 操作。这种设计既保留了 Preferences的轻量特性,又提供了响应式编程的便利性。
- 支持 加密存储(SecurityLevel.S1/S2/S3/S4)和跨设备查询(通过分布式框架)。
2, 性能上:
- 持久化变量最好是小于2kb的数据
- 不建议进行大量的数据持久化,因为PersistentStorage写入磁盘的操作是同步的,大量的数据本地化读写会同步在UI线程中执行,影响UI渲染性能
- 高频操作可能有性能损耗。
3,必须储备点:
- persistentStorage 不支持嵌套对象监听,Preferences 的 put() 方法需完整替换键值,直接修改嵌套属性不会触发装饰器监听的引用变更。需用新对象覆盖原值
4,代码
//初始化
PersistentStorage.persistProp('aProp', 47);
//加密
persistentStorage.create(context, {
securityLevel: dataPreferences.SecurityLevel.S4 // 最高等级加密
});
二、Preference
1, 优点:
- Preferences是Key-Value 形式的数据结构,基于 XML 文件存储,API 简单,线程安全,适用于非UI状态类配置的数据存储
- 支持 加密存储(SecurityLevel.S1/S2/S3/S4)和 跨设备查询(通过分布式框架)。
2, 性能上:
- key 长度不超过1KB,value长度不超过16MB
- 存储的数据不超过一万条
- Preferences中的数据会被缓存在内存中,因此它可以获取数据更快
3, 代码:
import dataPreferences from '@ohos.data.preferences';
// 获取 Preferences 实例
let preferences = await dataPreferences.getPreferences(context, 'myprefs');
// 存数据
await preferences.put('key', 'value');
await preferences.flush(); // 提交更改
// 取数据
let value = await preferences.get('key', 'defaultValue');
三RelationalStorage
RelationalStorage参考文档
1, 优点:
- 适合存储大量的或者复杂本地数据,并且具备复杂的数据过滤处理和具备查询性能要求
- 查询用到复杂的过滤并有查询性能的要求
2,特点
-
● 基于 SQLite 封装,提供 ORM(对象关系映射) 风格
API便于对数据的简单操作。提供了对数据的复杂的查询语句和数据过滤,适合需要频繁查询和统计的应用场景。 -
提供了createTransaction()对事务的ACID(原子性、一致性、隔离性、持久性)的支持。事务类型有DEFERRED、IMMEDIATE和EXCLUSIVE,默认为DEFERRED。
deferred:创建事务的时候不会真正开始事务,只有在事务对象中进行第一次的读或写操作才会开始事务
immediate:创建时会真正开始一个写事务;如果有别的写事务未提交,则会创建失败
exclusive:该类型的事务在WAL模式下和IMMEDIATE相同,但在其他日志模式下能够防止事务期间有其他连接读取数据库 -
通过其内部机制(如索引、缓存等)能够提供更高效的数据处理能力。
3,性能上:
- 单次查询数据量不超过5000条
4,代码:
import { relationalStore } from '@kit.ArkData'
export interface InterviewAudioItem extends relationalStore.ValuesBucket {
id: number | null
// 用户id
user_id: string
name: string
path: string
duration: number
size: number
create_time: number
}
export class AudioDB {
store: relationalStore.RdbStore | null = null
tableName: string = 'interview_audio'
// 初始化数据库
async initStore() {
// 我用上下文 一般只有两个玩法
// 页面中 getContext()
// 封装类中 AppStorage.get('context')
const ctx = AppStorage.get<Context>('context')
if (ctx) {
const store = await relationalStore.getRdbStore(ctx, {
name: 'interview_audio.db',
securityLevel: relationalStore.SecurityLevel.S1
})
const sql = `
CREATE TABLE IF NOT EXISTS ${this.tableName} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
name TEXT NOT NULL,
path TEXT NOT NULL,
duration INTEGER NOT NULL,
size INTEGER NOT NULL,
create_time INTEGER NOT NULL
)
`
await store.executeSql(sql)
this.store = store
}
}
// 添加
async insert(item: InterviewAudioItem) {
const rowId = await this.store?.insert(this.tableName, item)
if (rowId === undefined || rowId === -1) {
// 拿到了rowId就是插入成功 否则就是失败
return Promise.reject('insert fail')
} else {
return Promise.resolve()
}
}
// 删除
async delete(id: number) {
const predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('id', id)
const rowCount = await this.store?.delete(predicates)
if (rowCount === undefined || rowCount <= 0) {
// 受影响的行数为空或者小于0 删除失败
return Promise.reject('delete fail')
} else {
return Promise.resolve()
}
}
// 修改 update(更新后的数据)
async update(item: InterviewAudioItem) {
const predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('id', item.id)
const rowCount = await this.store?.update(item, predicates)
if (rowCount === undefined || rowCount <= 0) {
// 受影响的行数为空或者小于0 删除失败
return Promise.reject('update fail')
} else {
return Promise.resolve()
}
}
// 查询用户
async query(userId: string) {
const predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('user_id', userId) // 一个用户会录很多音 会有很多数据
const resultSet = await this.store?.query(predicates)
if (!resultSet) {
return Promise.reject('query fail')
}
const list: InterviewAudioItem[] = []
while (resultSet.goToNextRow()) {
list.push({
id: resultSet.getLong(resultSet.getColumnIndex('id')),
user_id: resultSet.getString(resultSet.getColumnIndex('user_id')),
name: resultSet.getString(resultSet.getColumnIndex('name')),
path: resultSet.getString(resultSet.getColumnIndex('path')),
duration: resultSet.getLong(resultSet.getColumnIndex('duration')),
size: resultSet.getLong(resultSet.getColumnIndex('size')),
create_time: resultSet.getLong(resultSet.getColumnIndex('create_time'))
})
}
resultSet.close() // 结果集 不用了 记得关闭
return Promise.resolve(list) // 查出来的数据在这里返回了
}
}
export const audioDB = new AudioDB()
记得点击收藏,会持续完成