SQLite 在鸿蒙元服务中的应用与 ArkTS 实践
在鸿蒙元服务开发过程中,为应用提供高效、稳定的本地数据存储能力至关重要。SQLite 作为一款轻量级、无服务器的嵌入式数据库,凭借其占用资源少、跨平台性强等优势,成为鸿蒙应用本地数据管理的理想选择。本文将结合鸿蒙开发语言 ArkTS,详细介绍 SQLite 在鸿蒙元服务中的应用,涵盖数据库创建、表结构设计以及数据的增删改查(CRUD)操作。
一、开发准备
1.1 权限配置
在config.json文件中添加必要权限,以确保应用能够对 SQLite 数据库文件进行读写操作:
{ "requestPermissions": [ { "name": "ohos.permission.READ_USER_STORAGE", "reason": "用于读取数据库文件" }, { "name": "ohos.permission.WRITE_USER_STORAGE", "reason": "用于写入数据库文件" } ] } |
1.2 导入相关模块
在 ArkTS 代码中,引入操作 SQLite 数据库所需的模块:
import rdb from '@ohos.data.rdb'; import common from '@ohos.app.ability.common'; |
二、数据库创建与表结构设计
2.1 数据库创建
创建一个数据库帮助类DatabaseHelper,用于管理数据库的创建与版本升级:
class DatabaseHelper { private static instance: DatabaseHelper | null = null; private dbHelper: rdb.RdbOpenHelper | null = null; private readonly DB_NAME = 'MyServiceDB'; private readonly DB_VERSION = 1; static getInstance(): DatabaseHelper { if (DatabaseHelper.instance === null) { DatabaseHelper.instance = new DatabaseHelper(); } return DatabaseHelper.instance; } async initDatabase(context: common.UIAbilityContext) { this.dbHelper = await rdb.getRdbOpenHelper( context, this.DB_NAME, { onCreate: (helper: rdb.RdbOpenHelper, version: number) => { const rdb = helper.getRdb(); this.createTables(rdb); }, onUpgrade: (helper: rdb.RdbOpenHelper, oldVersion: number, newVersion: number) => { const rdb = helper.getRdb(); this.upgradeTables(rdb, oldVersion, newVersion); } } ); } private createTables(rdb: rdb.Rdb) { const createTableSql = ` CREATE TABLE IF NOT EXISTS UserData ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, age INTEGER, email TEXT ) `; rdb.executeSql(createTableSql, []); } private upgradeTables(rdb: rdb.Rdb, oldVersion: number, newVersion: number) { // 这里可以编写表结构升级逻辑,例如添加新列 } } |
在上述代码中,initDatabase方法通过rdb.getRdbOpenHelper创建或打开数据库。当数据库首次创建时,会执行onCreate回调,在该回调中调用createTables方法创建数据表;若数据库版本发生变化,则执行onUpgrade回调进行表结构升级。
2.2 表结构设计
以存储用户信息为例,设计了UserData表,包含id(自增长主键)、username(用户名)、age(年龄)、email(邮箱)字段。在实际应用中,可根据业务需求灵活设计表结构,例如增加createTime(创建时间)、updateTime(更新时间)等字段。
三、数据增删改查操作
3.1 数据插入(Create)
创建UserDataService类,封装数据操作方法。数据插入方法insertUser用于向UserData表中插入一条用户数据:
class UserDataService { private dbHelper: DatabaseHelper = DatabaseHelper.getInstance(); async insertUser(user: { username: string, age: number, email: string }) { if (!this.dbHelper.dbHelper) { return; } const rdb = this.dbHelper.dbHelper.getRdb(); const values = [user.username, user.age, user.email]; return rdb.insert('UserData', ['username', 'age', 'email'], values); } } |
调用insertUser方法示例:
const userDataService = new UserDataService(); const newUser = { username: 'John', age: 30, email: 'john@example.com' }; userDataService.insertUser(newUser).then((result) => { console.log('插入成功,自增长ID:', result); }).catch((error) => { console.error('插入失败:', error); }); |
3.2 数据查询(Read)
3.2.1 查询所有数据
queryAllUsers方法用于查询UserData表中的所有用户数据:
async queryAllUsers() { if (!this.dbHelper.dbHelper) { return []; } const rdb = this.dbHelper.dbHelper.getRdb(); return rdb.query('UserData', ['id', 'username', 'age', 'email'], '', [], '', '', '', ''); } |
使用示例:
userDataService.queryAllUsers().then((result) => { const users = []; while (result.goToNextRow()) { const user = { id: result.getInt(result.getColumnIndex('id')), username: result.getString(result.getColumnIndex('username')), age: result.getInt(result.getColumnIndex('age')), email: result.getString(result.getColumnIndex('email')) }; users.push(user); } result.close(); console.log('所有用户数据:', users); }).catch((error) => { console.error('查询失败:', error); }); |
3.2.2 根据 ID 查询数据
queryUserById方法根据用户 ID 查询单条数据:
async queryUserById(id: number) { if (!this.dbHelper.dbHelper) { return null; } const rdb = this.dbHelper.dbHelper.getRdb(); const whereClause = 'id =?'; const whereArgs = [id]; const result = await rdb.query('UserData', ['id', 'username', 'age', 'email'], whereClause, whereArgs, '', '', '', ''); if (result.rowCount > 0) { result.goToFirstRow(); const user = { id: result.getInt(result.getColumnIndex('id')), username: result.getString(result.getColumnIndex('username')), age: result.getInt(result.getColumnIndex('age')), email: result.getString(result.getColumnIndex('email')) }; result.close(); return user; } result.close(); return null; } |
调用示例:
userDataService.queryUserById(1).then((user) => { if (user) { console.log('查询到的用户数据:', user); } else { console.log('未找到对应ID的用户'); } }).catch((error) => { console.error('查询失败:', error); }); |
3.3 数据更新(Update)
updateUser方法用于更新用户数据:
async updateUser(user: { id: number, username: string, age: number, email: string }) { if (!this.dbHelper.dbHelper) { return; } const rdb = this.dbHelper.dbHelper.getRdb(); const values = [user.username, user.age, user.email, user.id]; const whereClause = 'id =?'; return rdb.update('UserData', ['username', 'age', 'email'], values, whereClause, [user.id]); } |
使用示例:
const updatedUser = { id: 1, username: 'UpdatedJohn', age: 31, email: 'updatedjohn@example.com' }; userDataService.updateUser(updatedUser).then((result) => { if (result > 0) { console.log('更新成功'); } else { console.log('未找到对应ID的用户,更新失败'); } }).catch((error) => { console.error('更新失败:', error); }); |
3.4 数据删除(Delete)
deleteUserById方法根据用户 ID 删除数据:
async deleteUserById(id: number) { if (!this.dbHelper.dbHelper) { return; } const rdb = this.dbHelper.dbHelper.getRdb(); const whereClause = 'id =?'; const whereArgs = [id]; return rdb.delete('UserData', whereClause, whereArgs); } |
调用示例:
userDataService.deleteUserById(1).then((result) => { if (result > 0) { console.log('删除成功'); } else { console.log('未找到对应ID的用户,删除失败'); } }).catch((error) => { console.error('删除失败:', error); }); |
四、在鸿蒙元服务中集成
在鸿蒙元服务的onStart生命周期方法中初始化数据库:
import { CommonAbility } from '@ohos.app.ability'; import { DatabaseHelper } from './DatabaseHelper'; export default class MyService extends CommonAbility { async onStart() { const databaseHelper = DatabaseHelper.getInstance(); await databaseHelper.initDatabase(this.context); // 初始化完成后可以进行数据操作 } } |
通过以上步骤,我们在鸿蒙元服务中完成了 SQLite 数据库的集成与基本操作。在实际开发中,可根据具体业务需求,对数据库操作进行进一步的封装与扩展,例如添加事务处理、优化查询性能等,以满足复杂的应用场景。同时,合理管理数据库连接和资源释放,确保应用的稳定性和高效性。
上述内容完整呈现了 SQLite 在鸿蒙元服务中的应用全流程。若你对代码细节、其他业务场景的实现还有疑问,欢迎和我说说。