【HarmonyOS NEXT】数据库文件中存在相关表以及表数据,但查询结果集为空

 

【关键字】

关系型数据库 / 查询 / 不存在 / 表 / 表数据 / 为空 

【问题描述】

当前使用关系型数据库来创建数据库文件以及数据表,插入数据,API全部回调成功。调用查询数据的API,查询方法回调成功,但是查询数据行数为空。在模拟器的Device File Browser中找到数据库存放的文件,发现数据库文件中不存在相关表以及表数据。

这是什么原因?

测试代码及日志输出如下:

onPageShow(){
//数据表列
let columnFirst = new RdbColumnModel('name', 'char', 60);
let columnSecond = new RdbColumnModel('age', 'integer',10);
let columnArr = [columnFirst, columnSecond];

const rdbUtil = new RdbUtil('student_table', columnArr,'rdbDemo.db');
let valueBucket = {} as relationalStore.ValuesBucket;
valueBucket['name'] = '张三';
valueBucket['age'] = 18;

let valueBucket2 = {} as relationalStore.ValuesBucket;
valueBucket2['name'] = '李四';
valueBucket2['age'] = 19;

const valueArr: Array<relationalStore.ValuesBucket> = [valueBucket, valueBucket2];

rdbUtil.getRdbStore().then(()=>{
console.info('--------第一步数据库实例创建成功');
rdbUtil.createTable().then(()=>{
console.info('--------第二步数据库建表成功');
rdbUtil.insertData(valueArr).then(number =>{
console.info('--------第三步数据库数据表插入数据成功');
//创建谓词,进行查询
let predicates = new relationalStore.RdbPredicates('student_table');
predicates.equalTo('name', '张三');
rdbUtil.queryData(predicates,['name','age']).then((data:relationalStore.ResultSet)=>{
console.info('--------第四步数据库数据表查询数据成功,开始数据项判断');
console.info(`--------第四步数据库数据表查询数据成功,开始打印数据: ${data.columnNames}`);
console.info(`--------第四步数据库数据表查询数据成功,开始打印数据: ${data.columnCount}`);
}).catch((err:Error)=>{
console.info('--------第四步数据库数据表查询数据异常');
});
}).catch((err:Error)=>{
console.info('--------第三步数据库数据表插入数据异常');
});
}).catch((err:Error)=>{
console.info('--------第二步数据库建表异常');
});
}).catch((err:Error)=>{
console.info('--------第一步数据库实例出现异常');
})
}

数据库操作工具类关于数据查询的代码如下:

/*
根据谓词查询数据
*/
queryData(rdbPredicates:dataRdb.RdbPredicates,columns:Array<string>): Promise<dataRdb.ResultSet>{
return new Promise<dataRdb.ResultSet>((success,error)=>{
console.info('进入根据谓词查询数据');
this.rdbStore.query(rdbPredicates,columns).then((dataSet:dataRdb.ResultSet)=>{
console.info('根据谓词查询数据执行成功');
success(dataSet);
dataSet.close();
}).catch((err:Error)=>{
console.info('根据谓词查询数据执行失败');
error(err);
});
});
}

/*
查询表中所有数据
*/
queryTableAllData(tableName:string):Promise<dataRdb.ResultSet>{
return new Promise<dataRdb.ResultSet>((success,error)=>{
if(tableName === null || tableName === undefined || tableName === 'undefined'){
this.dataTableName = this.dataTableName;
}else {
this.dataTableName = tableName;
}
console.info('进入查询所有数据的方法');
let sql = `select * from ${this.dataTableName}`;
console.info(`查询所有数据sql语句是${sql}`);
this.rdbStore.querySql(sql).then((resultSet:dataRdb.ResultSet)=>{
console.info(`查询所有数据成功,返回结果是 ${JSON.stringify(resultSet)}`);
success(resultSet);
resultSet.close();
}).catch((err:Error)=>{
console.info(`查询所有数据失败,错误是 ${JSON.stringify(err)}`);
error(err);
})
})
}

【解决方案】

1.可以在插入数据的回调里面打印是否插入成功、以及返回的rowId,来查看是否真正插入。

this.store.insert(this.tableName, valueBucket).then((rowId: number) => {
console.info(`RdbDemo Insert is successful, rowId = ${rowId}`);
}).catch((err: BusinessError) => {
console.error(`RdbDemo Insert is failed, code is ${err.code},message is ${err.message}`);
})

2.在此案例中,数据插入是成功的,但在rdbUtil.queryData()方法中,开发者将查询返回的relationalStore.ResultSet关闭了,导致调用的地方获取的relationalStore.ResultSet其实已经不存在了,建议在外层调用处使用完之后再关闭。

示例代码如下:

/*
根据谓词查询数据
*/
queryData(rdbPredicates: relationalStore.RdbPredicates, columns: Array<string>): Promise<relationalStore.ResultSet> {
return new Promise<relationalStore.ResultSet>((success, error) => {
if (this.store) {
console.info('进入根据谓词查询数据');
this.store.query(rdbPredicates, columns).then((dataSet: relationalStore.ResultSet) => {
console.info('根据谓词查询数据执行成功');
success(dataSet);
dataSet.close(); // 此处将结果集ResultSet关闭,导致返回的结果集中无数据
}).catch((err: Error) => {
console.info('根据谓词查询数据执行失败');
error(err);
});
} else if (this.store === undefined) {
console.info('this.store is undefined');
} else if (this.store === null) {
console.info('this.store is null');
}
});
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JDBC查询MySQL数据库数据,需要以下步骤: 1. 加载MySQL JDBC驱动程序:`Class.forName("com.mysql.jdbc.Driver");` 2. 建立数据库连接:`Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name", "username", "password");` 3. 创建Statement对象:`Statement stmt = conn.createStatement();` 4. 执行查询语句:`ResultSet rs = stmt.executeQuery("SELECT * FROM table_name");` 5. 遍历ResultSet对象获取结果:可以使用while循环和rs.next()方法来遍历ResultSet对象,例如: ``` while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("id: " + id + ", name: " + name + ", age: " + age); } ``` 完整的查询MySQL数据的示例代码如下: ``` import java.sql.*; public class JdbcDemo { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name", "username", "password"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table_name"); while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("id: " + id + ", name: " + name + ", age: " + age); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 需要注意的是,其的`database_name`、`username`、`password`、`table_name`等需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值