参考文章如下
案例下载
加载预置数据库刷新文章列表
保存数据库到沙箱
ts
function saveFileToCache(file: resourceManager.RawFileDescriptor, dbName: string, context: UIContext,
bufferSize: number) {
// let context = AppStorage.get("context") as UIContext;
let RDBDirectory = context.getHostContext()!.databaseDir;
// 创建缓存文件(当前是覆盖式创建)
let cFile = RDBDirectory + '/customDir/rdb/' + dbName;
let cacheFile = fileIo.openSync(cFile, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 读取缓冲区大小
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);
}
async function INIT(context: UIContext, dbName: string, bufferSize: number) {
let RDBDirectory = context.getHostContext()!.databaseDir;
let resource = context.getHostContext()!.resourceManager;
// 创建数据库沙箱目录
try {
let dirPath = RDBDirectory + '/customDir';
fileIo.mkdirSync(dirPath);
dirPath = dirPath + '/rdb';
fileIo.mkdirSync(dirPath);
} catch (error) {
console.error(`mkdir rdbPath failed, error code: ${error.code}, message: ${error.message}.`);
}
//数据库名称传进来
//读取rawfile目录下db文件
try {
const value: resourceManager.RawFileDescriptor = await resource.getRawFd('rdb/' + dbName)
saveFileToCache(value, dbName, context, bufferSize);
} catch (error) {
console.error(`callback getRawFd failed, error code: ${error.code}, message: ${error.message}.`);
}
}
预制数据库的读取封装
ts
export async function getRDB(context: UIContext, name: string,customDir:string): Promise<relationalStore.RdbStore | undefined> {
const RDBDirectory = context.getHostContext()!.databaseDir;
console.log('RDBDirectory', RDBDirectory)
let store: relationalStore.RdbStore | undefined = undefined;
const STORE_CONFIG: relationalStore.StoreConfig = {
name,
securityLevel: relationalStore.SecurityLevel.S1,
customDir
};
try {
await relationalStore.getRdbStore(context.getHostContext(), STORE_CONFIG)
.then(async (rdbStore: relationalStore.RdbStore) => {
store = rdbStore;
})
.catch((err: BusinessError) => {
console.error(`Get RdbStore failed, code is ${err.code},message is ${err.message}`);
});
return store
} catch (e) {
console.info(`errorgetRsssssssss${e}`);
return undefined
}
}
使用
// 插入沙箱,/data/app/el2/100/database/com.***.***/customDir/rdb
await INIT(context, 'book.db', 10224 * 1024)
// 获取沙箱的数据库或者自己创建的关系型数据库
await getRDB(context, 'jiongji100_dictionary.db','../customDir/rdb')