鸿蒙NEXT版实战开发:如何读取本地/预制数据库?
·
往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)
如何读取本地/预制数据库
解决措施
- 将db文件推到数据存储沙箱路径:/data/app/el2/100/database/(bundleName)/entry/rdb/下,实现方式为用文件管理的接口打开本地数据库,读取本地数据库内容并写入沙箱路径下的db文件中。
import { fileIo, ReadOptions } from '@kit.CoreFileKit'; import { resourceManager } from '@kit.LocalizationKit'; import { relationalStore } from '@kit.ArkData'; let context = getContext(this); let RDBDirectory = getContext(this).getApplicationContext().databaseDir; let resource = getContext(this).resourceManager; function saveFileToCache(file: resourceManager.RawFileDescriptor, dbName: string) { // 创建缓存文件(当前是覆盖式创建) let cFile = RDBDirectory + '/entry/rdb/' + dbName; let cacheFile = fileIo.openSync(cFile, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); // 读取缓冲区大小 let bufferSize = 30000; let buffer = new ArrayBuffer(bufferSize); //创建buffer缓冲区 // 要copy的文件的offset let currentOffset = file.offset; let readOption: ReadOptions = { offset: currentOffset, //期望读取文件的位置。可选,默认从当前位置开始读 length: bufferSize //每次期望读取数据的长度。可选,默认缓冲区长度 }; // 后面len会一直减,直到没有 while (true) { // 读取buffer容量的内容 let readLength = fileIo.readSync(file.fd, buffer, readOption); // 写入buffer容量的内容 fileIo.writeSync(cacheFile.fd, buffer, { length: readLength }); //写到cacheFile里 // 判断后续内容 修改读文件的参数 // buffer没读满代表文件读完了 if (readLength < bufferSize) { break; } if (readOption.offset != undefined) { readOption.offset += readLength; } } console.log('Copy Success!!!') fileIo.close(cacheFile); } function INIT() { // 创建数据库沙箱目录 try { let dirPath = RDBDirectory + '/entry'; fileIo.mkdirSync(dirPath); dirPath = dirPath + '/rdb'; fileIo.mkdirSync(dirPath); } catch (error) { console.error(`mkdir rdbPath failed, error code: ${error.code}, message: ${error.message}.`); } //数据库名称 let dbName: string = 'Company.db'; //读取rawfile目录下db文件 try { resource.getRawFd('rdb/' + dbName, (error, value) => { if (error != null) { console.log(`callback getRawFd failed error code: ${error.code}, message: ${error.message}.`); } else { console.info(value.length.toString()); saveFileToCache(value, dbName); } }); } catch (error) { console.error(`callback getRawFd failed, error code: ${error.code}, message: ${error.message}.`); } } - 通过getRdbStore获取保存在沙箱路径下的db文件
function getRDB(): relationalStore.RdbStore | undefined { let result: relationalStore.RdbStore | undefined = undefined; const STORE_CONFIG: relationalStore.StoreConfig = { name: 'Company.db', securityLevel: relationalStore.SecurityLevel.S1 }; relationalStore.getRdbStore(context, STORE_CONFIG, (err, store) => { if (err) { console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`); return; } else { console.info(`Succeeded in getting RdbStore.`); } result = store; }) return result; }
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)