这是在index.js里面编写的代码,我想在这里面创建数据库rdbstore,然后在其他页面进行增删改查,但是现在在另外页面却无法使用
import router from '@system.router';
import prompt from '@system.prompt';
import featureAbility from '@ohos.ability.featureAbility';
import data_rdb from '@ohos.data.rdb';
import {data} from "../data";
var max = 10;
var info = null;
var D=data.ART;
export default {
data: {
length:D.length,
//艺术模块
art:{
ID: 0,
name: "",
basic_information: "",
work_image: 0,
author: "",
author_introduction: "",
people_image: 0,
collect_text: 0,
collect: 0,
address: "",
},
rdbStore:null,
m:0,
},
async onInit() {
if (this.m==0) {
console.info('AceApplication onCreate');
await this.creat()
var i=1;
while (this.rdbStore == null) {
console.log("创建数据库是第"+i+"次等待");
i++;
await new Promise(resolve => setTimeout(resolve, 100));
}
}
},
creat() {
//创建表
const SQL_CREATE_TABLE_allart ="CREATE TABLE IF NOT EXISTS allart (" +
"ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT, " +
"basic_information TEXT, " +
"work_image INTEGER , " +
"author TEXT , " +
"author_introduction TEXT, " +
"people_image INTEGER , " +
"collect_text INTEGER,"+
"collect INTEGER, " +
"address TEXT );"
var context = featureAbility.getContext()
const STORE_CONFIG = { name: "art.db" }
let promise = data_rdb.getRdbStore(context, STORE_CONFIG, 1);
return promise.then(async (store) => {
console.info('是创建数据库成功')
store.executeSql(SQL_CREATE_TABLE_allart)
let promises = []
for (let i = 0; i < D.length; i++) {
let promise = new Promise((resolve, reject) => {
store.insert("allart", D[i]).then((ret) => {
console.log("是插入成功: " + ret)
resolve(ret)
}, (err) => {
console.log("是插入失败: " + err)
reject(err)
})
})
promises.push(promise)
}
return Promise.all(promises).then((values) => {
console.log("是全部插入成功")
this.rdbStore=store
return this.rdbStore
}).catch((err) => {
console.log("是发生错误: " + err)
throw err
})
}).catch((err) => {
console.log("是创建数据库失败: " + err)
})
},
//查询
async viewArt(tableName, id) { //查询
let predsInfo = new data_rdb.RdbPredicates(tableName)
predsInfo.equalTo("ID", id)
return new Promise((resolve, reject) => {
this.rdbStore.query(predsInfo, ["*"]).then((resultSet) => {
while (resultSet.goToNextRow()) {
console.info(resultSet.columnNames[0] + "是:" + resultSet.getInt(0)) //ID
console.info(resultSet.columnNames[1] + "是:" + resultSet.getString(1)) //name
this.art = {
ID: resultSet.getInt(0),
name: resultSet.getString(1),
basic_information: resultSet.getString(2),
work_image: resultSet.getInt(3),
author: resultSet.getString(4),
author_introduction: resultSet.getString(5),
people_image: resultSet.getInt(6),
collect_text: resultSet.getInt(7),
collect: resultSet.getInt(8),
address: resultSet.getString(9)
}
console.log("art.id是" + this.art.ID)
resolve(this.art) // 将查询结果传递出去
}
}).catch(err => {
console.info('是查询表记录错误' + err)
reject(err) // 将错误传递出去
})
})
},
async onindex(){//实现刷新功能
console.log("是1")
await this.viewArt("allart",5)
console.log("是2")
},
onfound(){
router.push({
uri:'pages/found/found',
params:{
rdbStore:this.rdbStore
},
})
},
}
这是在found.js里面的代码,传递的rdbStore,查询不了,当返回到index.js界面后,原本的数据库也被消失了
import router from '@system.router';
import mediaquery from '@system.mediaquery';
import data_rdb from '@ohos.data.rdb';
export default {
data: {
rdbStore:null,
art:{
ID: 0,
name: "",
basic_information: "",
work_image: 0,
author: "",
author_introduction: "",
people_image: 0,
collect_text: 0,
collect: 0,
address: "",
},
},
onInit() {
},
onindex() {
router.push({
uri: 'pages/index/index',
params:{
m:1,
rdbStore:this.rdbStore
}
})
},
async viewArt(tableName, id) { //查询
let predsInfo = new data_rdb.RdbPredicates(tableName)
predsInfo.equalTo("ID", id)
return new Promise((resolve, reject) => {
this.rdbStore.query(predsInfo, ["*"]).then((resultSet) => {
while (resultSet.goToNextRow()) {
console.info(resultSet.columnNames[0] + "是:" + resultSet.getInt(0)) //ID
console.info(resultSet.columnNames[1] + "是:" + resultSet.getString(1)) //name
this.art = {
ID: resultSet.getInt(0),
name: resultSet.getString(1),
basic_information: resultSet.getString(2),
work_image: resultSet.getInt(3),
author: resultSet.getString(4),
author_introduction: resultSet.getString(5),
people_image: resultSet.getInt(6),
collect_text: resultSet.getInt(7),
collect: resultSet.getInt(8),
address: resultSet.getString(9)
}
console.log("art.id是" + this.art.ID)
resolve(this.art) // 将查询结果传递出去
}
}).catch(err => {
console.info('是查询表记录错误' + err)
reject(err) // 将错误传递出去
})
})
},
async onfound() {
console.log("是1")
await this.viewArt("allart",6)
console.log("是2")//实现刷新功能
},
}
根据提供的代码和描述,问题可能出现在以下几个方面:
数据库连接未成功建立:在使用数据存储模块前,需要先通过 data_rdb.openDatabase() 方法打开数据库连接。建议在 App 的入口文件(如 app.js)中完成此操作,并将打开的数据库连接作为参数传递到各个页面。如果数据库连接未成功建立,后续的数据库操作都会失败。
数据库表名或字段名不正确:在查询数据库时,需要指定正确的表名和字段名。请确保表名和字段名与数据库中的实际名称一致,否则查询会失败。
数据库查询未返回正确结果:在 viewArt() 方法中,查询结果应当是一个数组,而不是一个单独的对象。因此,应当使用 resultSet.goToFirstRow() 方法将结果集游标移到第一行,然后使用 resultSet.getColumnCount() 方法获取结果集中的列数,最后使用 resultSet.getString(colIndex) 方法获取指定列的值。如果查询未返回正确结果,可能是因为代码中没有正确处理结果集。
数据库连接被意外关闭:如果打开的数据库连接被意外关闭,后续的数据库操作都会失败。请确保在使用完数据库后,及时关闭数据库连接,可以使用 data_rdb.close() 方法关闭数据库连接。
综上所述,建议您在代码中添加必要的错误处理和日志输出,以便更好地定位问题所在。同时,可以参考官方文档和示例代码,学习并掌握数据存储模块的使用方法。