当我尝试从预先填充的SQLite数据库中读取时,我收到错误:sqlite3_prepare_v2 failure: no such table 'plant'
根据我的理解,SQLite默认在/ www文件夹中查找mydb.db文件,然后在找不到预先填充的mydb.db文件时创建一个空数据库。这就是它无法找到'plant'表的原因,因为新创建的空白数据库显然不包含'plant'表。但是我可以确认数据库在/ www文件夹中,并且当我在终端中运行sqlite3 mydb.db
然后.tables
时它包含'plant'表。
我无法弄清楚为什么它不是从预先填充的mydb.db文件中读取的。
文件夹结构(来自root):
/src
-/app
--/app.component.ts
/www
-/mydb.db
app.component.ts:
constructor(public platform: Platform, private sqlite: SQLite ) {
platform.ready().then(() => {
this.getData();
});
}
getData() {
this.sqlite.create({
name: 'mydb.db',
location: 'default'
}).then((db: SQLiteObject) => {
db.executeSql('SELECT * FROM plant ORDER BY id ASC', [])
.then(res => {
// Do Stuff
}).catch(e => console.log("FAIL executeSql:", e));
})
}
我尝试了很多我在StackOverflow上找到的修补程序,比如从我的设备上擦除应用程序,启动一个新的离子项目,然后复制应用程序和配置文件,并在数据库位置设置直接路径,但它仍在继续尝试从它创建的空数据库中读取。
Cordova-sqlite-storage插件不处理预填充数据库(截至本文撰写时)。我相信你需要Cordova-sqlite-ext插件。
来自repo的README.md(强调我的):
2018年9月的新版本将包括以下主要增强功能(litehelpers / Cordova-sqlite-storage#773):
- 浏览器平台支持使用kripken / sql.js(litehelpers / Cordova-sqlite-storage#576)
- 将组合cordova-sqlite-storage和cordova-sqlite-ext插件版本,预先填充的数据库不再需要单独的插件版本(litehelpers/Cordova-sqlite-storage#529)
- 包括来自DefinitelyTyped的类型(litehelpers / Cordova-sqlite-storage#768)
NB。 “意志”包括操作。
在ionic forum上有一个类似的问题。线程中的最后一篇文章开头:
Cordova SQLite Storage不使用您应用的www文件夹来存储数据。
移动设备不允许修改应用程序可执行文件的数据。这是为了防止安装一个覆盖另一个应用程序中的代码的应用程序(想象一下安装WhatsApp并破坏所有其他消息传递应用程序,因此您无法使用它们)。如果您的应用程序安全性不高,它还无法将代码注入应用程序并接管操作系统。
该帖子继续提出建议的解决方法。
离子论坛上的另一个thread似乎表明你可以在你的应用程序中使用cordova-sqlite-ext。你可以搜索cordova-sqlite-ext
的论坛,有几张海报让它有效。 cordova-sqlite-ext
在这个论坛上也有很多结果可以让你朝着正确的方向前进。
说实话,我认为它实际上并没有创建一个空的数据库。除非“/www / mydb.db”在您运行应用程序后是一个空数据库(这会让我感到惊讶)。虽然sqlite确实会创建在命令行命名的数据库(如果它不存在),但我怀疑在这种情况下它只是当它无法访问命名数据库时的行为。