【问题标题】:Error when reading from pre-populated SQLite database in Ionic project从 Ionic 项目中预填充的 SQLite 数据库读取时出错
【发布时间】:2019-02-09 21:30:15
【问题描述】:

当我尝试从预填充的 SQLite 数据库中读取数据时收到错误消息:sqlite3_prepare_v2 failure: no such table 'plant'

据我了解,SQLite 默认在 /www 文件夹中查找 mydb.db 文件,然后在找不到预填充的 mydb.db 文件时创建一个空数据库。这就是它找不到“植物”表的原因,因为新创建的空白数据库显然不包含“植物”表。但是我可以确认数据库 在 /www 文件夹中,并且当我在终端中运行 sqlite3 mydb.db 然后 .tables 时它包含“植物”表。

我无法弄清楚为什么它没有从预先填充的 mydb.db 文件中读取。

文件夹结构(从根目录):

/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 上找到的修复程序,例如从我的设备中擦除应用程序、启动一个新的 ionic 项目然后复制应用程序和配置文件,以及在数据库位置设置直接路径,但它仍然尝试从它创建的空数据库中读取数据。

【问题讨论】:

    标签: android sqlite typescript ionic-framework


    【解决方案1】:

    Cordova-sqlite-storage 插件不处理预填充的数据库(在撰写本文时)。我相信你需要 Cordova-sqlite-ext 插件。

    来自回购的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)

    • 包括来自 distinctlyTyped 的类型 (litehelpers/Cordova-sqlite-storage#768)

    注意。 “will”包含是操作符。

    ionic forum 上也有类似的问题。线程中的最后一个帖子开始:

    Cordova SQLite 存储不使用您应用的 www 文件夹来存储 数据。

    移动设备不允许修改应用可执行文件的数据。 这是为了防止安装覆盖另一个代码的应用程序 应用程序(想象一下安装 WhatsApp,它会破坏所有其他消息传递 应用程序,因此您无法使用它们)。这也使得代码不可能 如果您的应用程序安全,则注入应用程序并接管操作系统 不是很好。

    该帖子继续提出建议的解决方法。

    ionic 论坛上的另一个thread 似乎表明您可以在您的应用程序中使用 cordova-sqlite-ext。您可以在该论坛中搜索cordova-sqlite-ext,有几张海报可以使用它。在这个论坛上,cordova-sqlite-ext 也有很多结果,可以让您找到正确的方向。

    老实说,我不认为它实际上是在创建一个空数据库。除非“/www/mydb.db”在您运行应用程序后是一个空数据库(这让我感到惊讶)。虽然如果它不存在,sqlite 确实会在命令行中创建命名数据库,但我怀疑在这种情况下,它只是无法访问命名数据库时的行为。

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 2016-10-24
      • 2022-07-07
      • 2015-11-24
      • 2020-03-19
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      相关资源
      最近更新 更多