HarmonyOS 鸿蒙Next中数据库文件推到沙箱目录下
HarmonyOS 鸿蒙Next中数据库文件推到沙箱目录下 为什么使用context.databaseDir将rawfile目录下的数据库文件推到沙箱中发现不是在rdb目录下,而是在同一目录,并且通过getRdbStore相同配置数据库获取不到数据库文件内容,但是手动将数据库文件upload到沙箱中的rdb目录下,就可以通过getRdbStore相同配置数据库访问查询,是为什么呢?有大神可以提供正确的示例代码吗?
【背景知识】
getRawFd:获取resources/rawfile目录下对应rawfile文件所在HAP的文件描述符(fd)。
fs.write:将数据写入文件。
relationalStore.getRdbStore:创建或打开已有的关系型数据库,可以配置config参数,然后通过RdbStore调用相关接口执行数据操作。
【参考方案】
可参考加载预置数据库刷新文章列表示例,通过文件管理和资源管理实现了加载本地rawfile文件夹下数据库文件的效果。
- 在EntryAbility组件初始化OnCreate时,使用getRawFd和fs.write实现copyDBToSandbox方法将rawfile目录下的db文件拷贝至应用沙箱。
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
AppStorage.setOrCreate<Context>('context', this.context);
getDBOperatorManager().copyDBToSandbox(this.context, 'book.db');
}
- 在页面加载aboutToAppear时,使用relationalStore.getRdbStore实现readBookList接口通过RdbStore读取沙箱下db数据库文件,实例化Book对象,创建BookArray,存入读取到的数据。
aboutToAppear(): void {
getDBOperatorManager()
.readBookList(this.context, 3)
.then(bookArray => {
this.data.reloadData(bookArray);
this.filterVipData(bookArray);
});
}
- 进行页面渲染,通过布局组件,渲染刷新杂志文章页面。
更多关于HarmonyOS 鸿蒙Next中数据库文件推到沙箱目录下的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,数据库文件默认存储在应用的沙箱目录内,路径为/data/app/el2/100/base/<package-name>/database/
。该设计遵循应用沙箱隔离原则,确保数据安全且仅限应用自身访问。开发者可通过ohos.data.relationalStore
相关API进行数据库操作,无需手动管理文件路径。
在HarmonyOS Next中,context.databaseDir
返回的是应用沙箱的根数据库目录,而非RDB子目录。RDB存储有独立的路径管理机制,直接放置文件到databaseDir
可能无法被RDB运行时识别。
正确做法是使用getRdbStore
创建或打开数据库时,系统会自动在RDB专用目录(如/data/app/.../rdb/
)中处理文件。若需预置数据库,应通过RdbPredicates
或迁移接口导入数据,而非直接操作文件路径。
示例代码:
import relationalStore from '@ohos.data.relationalStore';
let store: relationalStore.RdbStore;
const config: relationalStore.StoreConfig = {
name: 'test.db',
securityLevel: relationalStore.SecurityLevel.S1
};
relationalStore.getRdbStore(context, config, (err, rdbStore) => {
if (err) {
console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
return;
}
store = rdbStore;
// 执行数据查询操作
});
手动操作文件可能导致权限或元数据不一致,建议通过标准API管理数据库内容。