报错信息在hbuildx的控制台中点开:
{
"code": -1404,
"message": "android.database.sqlite.SQLiteException: no such table: history (code 1 SQLITE_ERROR): , while compiling: select * FROM history ,https://ask.dcloud.net.cn/article/282"
}
封装的sql部分(单独的文件,暂时命名为sqlite.js):
/**
* @Description: 查询数据库下的所有表
*/
selectTableName(){
return new Promise((resolve, reject) => {
plus.sqlite.selectSql({
name: 'example', //数据库名称
sql: "select * from history", //SQL查询语句
success(e) {
console.log(e)
resolve(e);
},
fail(e) {
console.log(e)
reject(e);
}
})
})
},
这句报错的大致意思是:没找到你要查询的数据表,请前往官网参考错误代码
刚用的时候会有人一看到-1404就会懵,“数据库明明本地连接正常,数据表也在本地创建了呀?为什么会报这种奇怪的错误・ࡇ・?”
关键是就这么点代码,我能报什么错 d(ŐдŐ๑) ?
解决方案:
原因其实出现在这里:
当我打开调试机(模拟器)的app路径:
PFTM10 > Android > data > uni.UNI679E2B0 > apps> _UNI_679E2B0>doc
结果发现这里生成了数据库,不是本地的,而是在手机里 Σ(゚д゚lll)
将这里的数据库文件复制出来,在sqlite studio 或者Navicat中打开后,发现啥都没有
也就是说代码运行在app环境里,电脑本地的当然用不了,发现这个问题的时候我自己都笑了出来,真的无语......
所以解决方法就是加一个数据表是否存在的判断,如果没有就创建一张新表
创建新表:
/**
* @Description: 数据库建表
* @author: ZBL
* 数据库建表 sql:'CREATE TABLE IF NOT EXISTS dbTable("id" INTEGER PRIMARY KEY AUTOINCREMENT,"name" TEXT)
* 创建 CREATE TABLE IF NOT EXISTS 、 dbTable 是表名,不能用数字开头、括号里是表格的表头
* INTEGER PRIMARY KEY AUTOINCREMENT 是id字段自动递增
*/
// 使用
// DB.createTable('bus_mzpy','"id" INTEGER PRIMARY KEY AUTOINCREMENT,"mzpy_name" TEXT ,"dept_id" INTEGER ,"dept_name" TEXT ,"mzpy_concent" TEXT')
createTable(dbTable, data) {
return new Promise((resolve, reject) => {
// executeSql: 执行增删改等操作的SQL语句
plus.sqlite.executeSql({
name: this.dbName,
sql: `CREATE TABLE IF NOT EXISTS history("id" INTEGER PRIMARY KEY AUTOINCREMENT,"temp" TEXT,"humidity" TEXT,"createTime" DATE)`,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
判断逻辑参考:
// 数据库连接操作
var DB = require("@/utils/sqlite.js");
isSqlConnect: function() {
that = this;
if (DB.isOpen()) {
DB.selectTableName().then((res) => {
console.log('有表');
}).catch((res) => {
console.log('没表');
DB.createTable() //建表操作
console.log('数据表创建完成');
})
} else {
DB.openSqlite() //打开 || 创建 数据库
DB.selectTableName().then((res) => {
console.log('有表');
}).catch((res) => {
console.log('没表');
DB.createTable() //建表操作
console.log('数据表创建完成');
})
}
代码解释:
先进行判断,判断数据库有无连接,若没有链接则 DB.openSqlite() 打开或创建数据库(在手机里创建,电脑本地的因为环境不一样所以用不了)
之后进行查询 DB.selectTableName() ,then和catch分别回调成功、失败的结果
若没有你在SQL查询语句中查的数据表就会执行 DB.createTable() 进行创建数据表,问题解决
之后搭配插入数据等方法,轻松实现在前端建立数据库,应用更加广泛 (๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)
总结:
此问题其实是初次使用者没有分清楚uniapp打包基座后sqlite生成的数据库会变成app环境中的.db文件,电脑本地的和app环境(不管是 手机 调试还是 模拟器 调试)的一定要分清楚,这问题发现后解决起来非常简单
若是对你有帮助,不妨点个免费的赞 ฅ՞•ﻌ•՞ฅ
最后,给大家跳段街舞
ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ