大良陈村网站建设专业的聊城网站优化

张小明 2026/1/14 4:09:03
大良陈村网站建设,专业的聊城网站优化,网站发展历程,如何开通微信小程序商城问题描述 在 HarmonyOS 应用开发中,如何使用 RelationalStore 实现数据库的增删改查(CRUD)操作?很多开发者在使用关系型数据库时遇到以下问题: 不清楚如何正确初始化数据库不知道如何设计 Dao 层查询结果集如何转换为对象如何处理异步操作 解决方案 1. 技术原理 Relation…问题描述在 HarmonyOS 应用开发中,如何使用 RelationalStore 实现数据库的增删改查(CRUD)操作?很多开发者在使用关系型数据库时遇到以下问题:不清楚如何正确初始化数据库不知道如何设计 Dao 层查询结果集如何转换为对象如何处理异步操作解决方案1. 技术原理RelationalStore 是 HarmonyOS 提供的关系型数据库解决方案,基于 SQLite 实现。核心流程:DatabaseHelper(单例) → 初始化RdbStore → 创建表结构 → Dao层操作2. 完整实现代码步骤 1: 创建数据库管理类import relationalStore from ohos.data.relationalStore; ​ export class DatabaseHelper { private static instance: DatabaseHelper; private rdbStore: relationalStore.RdbStore | null null; private readonly DB_NAME: string app_database.db; private readonly DB_VERSION: number 1; private constructor() {} /** * 获取单例 */ static getInstance(): DatabaseHelper { if (!DatabaseHelper.instance) { DatabaseHelper.instance new DatabaseHelper(); } return DatabaseHelper.instance; } /** * 初始化数据库 */ async init(context: Context): Promisevoid { const config: relationalStore.StoreConfig { name: this.DB_NAME, securityLevel: relationalStore.SecurityLevel.S1 }; this.rdbStore await relationalStore.getRdbStore(context, config); await this.createTables(); } /** * 创建表结构 */ private async createTables(): Promisevoid { const createTableSql CREATE TABLE IF NOT EXISTS user ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, nickname TEXT, email TEXT, create_time INTEGER, update_time INTEGER ) ; await this.rdbStore!.executeSql(createTableSql); } /** * 获取数据库实例 */ getStore(): relationalStore.RdbStore { if (!this.rdbStore) { throw new Error(Database not initialized); } return this.rdbStore; } }步骤 2: 创建数据模型export class User { id: number 0; username: string ; nickname: string ; email: string ; createTime: number 0; updateTime: number 0; /** * 从数据库记录创建对象 */ static fromDb(record: Recordstring, Object): User { const user new User(); user.id record[id] as number; user.username record[username] as string; user.nickname record[nickname] as string; user.email record[email] as string; user.createTime record[create_time] as number; user.updateTime record[update_time] as number; return user; } }步骤 3: 实现 Dao 层import relationalStore from ohos.data.relationalStore; import { User } from ../models/User; import { DatabaseHelper } from ./DatabaseHelper; ​ const TABLE_NAME user; ​ export class UserDao { private dbHelper: DatabaseHelper; constructor() { this.dbHelper DatabaseHelper.getInstance(); } /** * 插入用户 */ async insert(user: User): Promisenumber { const store this.dbHelper.getStore(); const valueBucket: relationalStore.ValuesBucket { username: user.username, nickname: user.nickname, email: user.email, create_time: Date.now(), update_time: Date.now() }; return await store.insert(TABLE_NAME, valueBucket); } /** * 更新用户 */ async update(user: User): Promisenumber { const store this.dbHelper.getStore(); const valueBucket: relationalStore.ValuesBucket { nickname: user.nickname, email: user.email, update_time: Date.now() }; const predicates new relationalStore.RdbPredicates(TABLE_NAME); predicates.equalTo(id, user.id); return await store.update(valueBucket, predicates); } /** * 根据ID查询 */ async findById(id: number): PromiseUser | null { const store this.dbHelper.getStore(); const predicates new relationalStore.RdbPredicates(TABLE_NAME); predicates.equalTo(id, id); const resultSet await store.query(predicates); let user: User | null null; if (resultSet.goToFirstRow()) { const record this.resultSetToRecord(resultSet); user User.fromDb(record); } resultSet.close(); return user; } /** * 查询所有用户 */ async findAll(): PromiseUser[] { const store this.dbHelper.getStore(); const predicates new relationalStore.RdbPredicates(TABLE_NAME); const resultSet await store.query(predicates); const users: User[] []; while (resultSet.goToNextRow()) { const record this.resultSetToRecord(resultSet); users.push(User.fromDb(record)); } resultSet.close(); return users; } /** * 删除用户 */ async delete(id: number): Promisenumber { const store this.dbHelper.getStore(); const predicates new relationalStore.RdbPredicates(TABLE_NAME); predicates.equalTo(id, id); return await store.delete(predicates); } /** * 将ResultSet转换为记录对象 */ private resultSetToRecord(resultSet: relationalStore.ResultSet): Recordstring, Object { const record: Recordstring, Object {}; const columnNames resultSet.columnNames; for (const name of columnNames) { const index resultSet.getColumnIndex(name); const type resultSet.getColumnType(index); switch (type) { case relationalStore.ColumnType.TYPE_INTEGER: record[name] resultSet.getLong(index); break; case relationalStore.ColumnType.TYPE_STRING: record[name] resultSet.getString(index); break; case relationalStore.ColumnType.TYPE_FLOAT: record[name] resultSet.getDouble(index); break; default: record[name] resultSet.getString(index); } } return record; } }步骤 4: 在 EntryAbility 中初始化import { DatabaseHelper } from ../database/DatabaseHelper; ​ export default class EntryAbility extends UIAbility { async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promisevoid { // 初始化数据库 await DatabaseHelper.getInstance().init(this.context); } }步骤 5: 使用示例import { UserDao } from ../database/UserDao; import { User } from ../models/User; ​ // 创建用户 const userDao new UserDao(); const user new User(); user.username zhangsan; user.nickname 张三; user.email zhangsanexample.com; ​ const userId await userDao.insert(user); console.log(插入用户ID:, userId); ​ // 查询用户 const foundUser await userDao.findById(userId); console.log(查询到用户:, foundUser?.nickname); ​ // 更新用户 if (foundUser) { foundUser.nickname 张三三; await userDao.update(foundUser); } ​ // 查询所有用户 const allUsers await userDao.findAll(); console.log(用户总数:, allUsers.length); ​ // 删除用户 await userDao.delete(userId);3. 运行效果[日志] 插入用户ID: 1 [日志] 查询到用户: 张三 [日志] 用户总数: 1 [日志] 删除成功关键要点1. 单例模式DatabaseHelper 使用单例模式,确保全局只有一个数据库实例,避免资源浪费。2. 异步操作所有数据库操作都是异步的,使用async/await确保数据一致性。3. ResultSet 处理必须调用goToFirstRow()或goToNextRow()移动游标使用完毕后必须调用close()释放资源根据列类型使用对应的 getter 方法4. ValuesBucket插入和更新操作使用ValuesBucket传递数据,字段名必须与表结构一致。5. RdbPredicates查询和删除操作使用RdbPredicates构建条件,支持链式调用:predicates .equalTo(status, 1) .and() .greaterThan(age, 18) .orderByAsc(create_time);常见问题Q1: 如何处理数据库初始化失败?async init(context: Context): Promisevoid { try { const config: relationalStore.StoreConfig { name: this.DB_NAME, securityLevel: relationalStore.SecurityLevel.S1 }; this.rdbStore await relationalStore.getRdbStore(context, config); await this.createTables(); } catch (err) { console.error(数据库初始化失败:, JSON.stringify(err)); throw err; } }Q2: 如何实现分页查询?async findByPage(page: number, pageSize: number): PromiseUser[] { const store this.dbHelper.getStore(); const predicates new relationalStore.RdbPredicates(TABLE_NAME); predicates.limitAs(pageSize).offsetAs((page - 1) * pageSize); const resultSet await store.query(predicates); const users: User[] []; while (resultSet.goToNextRow()) { const record this.resultSetToRecord(resultSet); users.push(User.fromDb(record)); } resultSet.close(); return users; }Q3: 如何执行复杂 SQL 查询?async customQuery(sql: string, args: Arraystring | number): Promiseany[] { const store this.dbHelper.getStore(); const resultSet await store.querySql(sql, args); const results: any[] []; while (resultSet.goToNextRow()) { results.push(this.resultSetToRecord(resultSet)); } resultSet.close(); return results; }总结本文展示了 HarmonyOS 中 RelationalStore 的完整 CRUD 实现方案:✅ 单例模式管理数据库实例✅ 规范的 Dao 层设计✅ 类型安全的数据转换✅ 完善的错误处理✅ 支持复杂查询参考资料HarmonyOS 关系型数据库开发指南RelationalStore API 文档
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

企业做网站算办公费用吗网站建设服务器的选择方案

日常办公沟通、生活联络都离不开 QQ,可突然弹出的 “软件已被破坏或部分文件丢失” 提示(错误码 0x80010001)总能让人措手不及。明明之前还能用,毫无征兆就无法打开,尝试直接卸载重装后问题依旧 —— 残留的注册表垃圾…

张小明 2026/1/6 2:18:18 网站建设

马云1688网站在濮阳如何做东莞市网站建设哪家好

PaddleOCR移动端部署终极指南:从训练到应用的完整流程 【免费下载链接】PaddleOCR 飞桨多语言OCR工具包(实用超轻量OCR系统,支持80种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部…

张小明 2026/1/6 2:18:16 网站建设

太原医院网站建设wordpress wpdx主题

大家好,我是 Qoder 的开发工程师,我叫夏晓文。今天分享的主要内容是 Qoder 如何构建代码库理解能力,以及我们在开发过程中的一些经验总结、好的设计和核心能力。 代码库理解能力简单讲分为三部分:Repo Wiki、检索引擎以及记忆。今…

张小明 2026/1/6 2:18:12 网站建设

模板网站开发定制规划设计导航网站

2025年如果你想构建和开发智能体 AI(Agentic AI)你到底需要用到哪些技术,做哪些事情,下图可以很完整的告诉你。并用不同颜色区分了 必须做(Must do)、可选(Optional) 和 工具/技术&a…

张小明 2026/1/6 6:59:29 网站建设

淄博网站建设有实力网站建设公司 预算

第一章:R中qubit初始化的核心概念在量子计算的R语言实现中,qubit(量子比特)的初始化是构建量子算法的第一步。与经典比特只能处于0或1不同,qubit可以处于叠加态,其状态由复数系数表示的概率幅决定。在R中&a…

张小明 2026/1/11 16:44:55 网站建设