最近在尝试将一款图片生成应用适配到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提倡的简洁性也体现在数据层设计上 - 避免过度抽象,保持合理的范式级别。下一步需要测试大数据量下的性能表现,并考虑是否需要引入缓存层。


bianchengyishu
1 声望0 粉丝