经过我不懈的努力我终于连上了华为本地的数据库🥺
思路
我需要在点击“收藏本文”后把该图书的信息添加到数据库,退出重进之后书架上的东西不会清除,通过查询数据库得到数组之后,在书架页面进行渲染。
运行效果
点击之后将图书加到了书架上,不过这只是临时的
退出该程序
再点进去之后刚刚加入的信息并没有消失(我把原本的图书码掉了)
实现过程
我是按照黑马的视频学习的,大家有兴趣可以去看一下
首先用到的是它提供的
import relationalStore from '@ohos.data.relationalStore';
然后先初始化这个数据库,写数据库的名字,和安全等级
const config = {
name: 'Myapp.db',
securityLevel: relationalStore.SecurityLevel.S1
};
接着写sql语句,根据自己的需求写
const sql = `CREATE TABLE IF NOT EXISTS TASK (
IMG TEXT PRIMARY KEY,
NAME TEXT,
AUTHOR TEXT)`;
用 relationalStore.getRdbStore
方法来获取 rdbStore
relationalStore.getRdbStore(context, config, (err, rdbStore) => {
if (err) {
console.log('testTag', '获取rdbStore失败');
}
rdbStore.executeSql(sql);
console.log('testTag', '创建Task成功');
this.rdbStore = rdbStore;
});
这个写完之后要在Entryability文件里面调用这个方法
查询操作
async getTask() {
let predicates = new relationalStore.RdbPredicates(this.tableName);
let result = await this.rdbStore.query(predicates, ['IMG', 'NAME', 'AUTHOR']);//要查询的列的名称
let tasks: TaskInfo[] = [];
while (!result.isAtLastRow) {
result.goToNextRow();
let img = result.getString(result.getColumnIndex('IMG'));//查询赋值
let name = result.getString(result.getColumnIndex('NAME'));
let author = result.getString(result.getColumnIndex('AUTHOR'));
tasks.push({img , name, author });//将结果存到tasks数组里面
}
console.log('testTag', '查询到数据');
return tasks;//返回数组给另一个页面调用
}
插入操作
async addTask(img: string, name: string, author: string) {
if (!this.rdbStore) {
throw new Error('rdbStore 尚未初始化');
}
return this.rdbStore.insert(this.tableName, { img, name, author });
}
在插入的时候调用插入方法就好了
然后查询的时候要在使用的页面build方法之前写aboutToAppear方法,这个方法会在调用build方法之前调用
如下:
aboutToAppear(){
TaskModel2.getTask2()
.then(tasks=>{
this.tasks=tasks
})
}
代码
import relationalStore from '@ohos.data.relationalStore';
import taskpool from '@ohos.taskpool';
import { TaskInfo } from '../MainInfo/TaskInfo';
class TaskModel {
private rdbStore: relationalStore.RdbStore;
private tableName: string = 'TASK';
initTBD(context) {
const config = {
name: 'Myapp.db',
securityLevel: relationalStore.SecurityLevel.S1
};
const sql = `CREATE TABLE IF NOT EXISTS TASK (
IMG TEXT PRIMARY KEY,
NAME TEXT,
AUTHOR TEXT)`;
relationalStore.getRdbStore(context, config, (err, rdbStore) => {
if (err) {
console.log('testTag', '获取rdbStore失败');
}
rdbStore.executeSql(sql);
console.log('testTag', '创建Task成功');
this.rdbStore = rdbStore;
});
}
async getTask() {
let predicates = new relationalStore.RdbPredicates(this.tableName);
let result = await this.rdbStore.query(predicates, ['IMG', 'NAME', 'AUTHOR']);
let tasks: TaskInfo[] = [];
while (!result.isAtLastRow) {
result.goToNextRow();
let img = result.getString(result.getColumnIndex('IMG'));
let name = result.getString(result.getColumnIndex('NAME'));
let author = result.getString(result.getColumnIndex('AUTHOR'));
tasks.push({img , name, author });
}
console.log('testTag', '查询到数据');
return tasks;
}
async addTask(img: string, name: string, author: string) {
if (!this.rdbStore) {
throw new Error('rdbStore 尚未初始化');
}
return this.rdbStore.insert(this.tableName, { img, name, author });
}
}
let taskModel = new TaskModel();
export default taskModel as TaskModel;
Bug
这个其实有一个Bug,就是图片存取有问题,实现不了图片的调用
我之前图片存的是Resource类型,但是数据库中我要存他的地址,是一个Text,这就导致存的时候出现了问题,我输出this.img显示的是Object类型,这个我真的很纳闷到底怎么存?
有佬指点吗