新手使用uniapp使用sqlite常见错误--“code“: -1404,android.database.sqlite.SQLiteException: no such table: xxx

报错信息在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环境(不管是 手机 调试还是 模拟器 调试)的一定要分清楚,这问题发现后解决起来非常简单

若是对你有帮助,不妨点个免费的赞 ฅ՞•ﻌ•՞ฅ 

最后,给大家跳段街舞

ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值