从Ionic项目中预先填充的SQLite数据库中读取时出错

问题描述 投票:0回答:1

当我尝试从预先填充的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上找到的修补程序,比如从我的设备上擦除应用程序,启动一个新的离子项目,然后复制应用程序和配置文件,并在数据库位置设置直接路径,但它仍在继续尝试从它创建的空数据库中读取。

android sqlite typescript ionic-framework
1个回答
0
投票

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确实会创建在命令行命名的数据库(如果它不存在),但我怀疑在这种情况下它只是当它无法访问命名数据库时的行为。

© www.soinside.com 2019 - 2024. All rights reserved.