最近在尝试将一款图片生成应用适配到HarmonyOS NEXT平台,记录下数据库模块的开发过程。HarmonyOS Design的设计理念强调简洁高效,这对数据层设计提出了更高要求。
数据库选型与设计
根据HarmonyOS NEXT的API12规范,我们选择使用轻量级的关系型数据库@ohos.data.relationalStore。图片生成应用主要需要存储两类数据:用户生成记录和模型配置参数。
typescript
// 数据库初始化
import relationalStore from '@ohos.data.relationalStore';
const STORE_CONFIG = {
name: 'ImageGenDB.db',
securityLevel: relationalStore.SecurityLevel.S1
};
let rdbStore;
async function initDB() {
try {
rdbStore = await relationalStore.getRdbStore(globalThis.context, STORE_CONFIG);
await rdbStore.executeSql(`
CREATE TABLE IF NOT EXISTS generation_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
prompt TEXT NOT NULL,
negative_prompt TEXT,
style_id INTEGER,
generate_time DATETIME DEFAULT (datetime('now','localtime')),
image_uri TEXT,
FOREIGN KEY (style_id) REFERENCES style_params(id)
)`);
await rdbStore.executeSql(`
CREATE TABLE IF NOT EXISTS style_params (
id INTEGER PRIMARY KEY AUTOINCREMENT,
style_name TEXT UNIQUE,
cfg_scale REAL DEFAULT 7.0,
steps INTEGER DEFAULT 30,
sampler TEXT DEFAULT 'euler_a'
)`);
} catch (err) {
console.error(`DB init failed: ${err}`);
}
}
数据操作封装
遵循HarmonyOS Design的流畅性原则,我们对常用操作进行了封装:
typescript
// 插入生成记录
async function insertGeneration(prompt: string, imageUri: string, styleId?: number) {
const valueBucket = {
'prompt': prompt,
'image_uri': imageUri,
'style_id': styleId || null
};
try {
const insertId = await rdbStore.insert('generation_records', valueBucket);
return insertId;
} catch (err) {
console.error(`Insert failed: ${err}`);
return -1;
}
}
// 分页查询历史记录
async function queryHistory(page: number, pageSize: number = 10) {
const offset = (page - 1) * pageSize;
const predicates = new relationalStore.RdbPredicates('generation_records');
predicates.orderByDesc('generate_time')
.offset(offset)
.limit(pageSize);
try {
const result = await rdbStore.query(predicates,
['id', 'prompt', 'image_uri', 'generate_time']);
return result;
} catch (err) {
console.error(`Query failed: ${err}`);
return [];
}
}
性能优化考虑
1.图片URI采用相对路径存储,实际文件通过@ohos.file.fs管理
2.高频查询字段建立了索引
3.批量操作使用事务处理
typescript
async function batchInsertStyles(styles: Array<Object>) {
await rdbStore.beginTransaction();
try {
for (const style of styles) {
await rdbStore.insert('style_params', style);
}
await rdbStore.commit();
} catch (err) {
await rdbStore.rollback();
console.error(`Batch insert failed: ${err}`);
}
}
总结
在HarmonyOS NEXT上开发数据库模块,需要特别注意API12的变更点,比如权限管理和后台任务限制。HarmonyOS Design提倡的简洁性也体现在数据层设计上 - 避免过度抽象,保持合理的范式级别。下一步需要测试大数据量下的性能表现,并考虑是否需要引入缓存层。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。