HarmonyOS NEXT 中级开发笔记:基于HarmonyOS Design的图片生成应用数据库设计实践

55 阅读1分钟

最近在尝试将一款图片生成应用适配到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) {

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