【问题标题】:Ionic: SQL Lite Insert Into Statement does not work离子:SQLite 插入语句不起作用
【发布时间】:2019-02-14 03:06:42
【问题描述】:

我正在尝试使用 Ionic 创建一个简单的 Android 应用程序。我想在SQL Lite and IonicIonic and Cordova from browser 上的一些文章的帮助下使用SQL Lite 数据库。我设法在this.initializeApp() 之后使用 app.components.ts 中使用的以下代码设置了我的数据库(至少我的应用程序似乎可以运行):

init_db(){
var config = this.sqlite.create({
  name: 'data.db',
  location: 'default'
})
.then((db: SQLiteObject) =>{
  this.db = db;
  db.executeSql('CREATE TABLE "ExpenseModel" ( `EXPENSE_LIMIT` INTEGER NOT NULL, `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `MODEL_NAME` TEXT NOT NULL UNIQUE, `PINNED` INTEGER )');
  // .then(() => console.log('Executed'))
  // .catch(e=> console.log(e));

});
// .catch(e => console.log(e));

(异常处理被注释掉,只看是否抛出异常)

但是,执行简单的 SQL Lite 插入的以下代码不起作用:

this.db.executeSql('INSERT INTO "ExpenseModel" (EXPENSE_LIMIT, ID, MODEL_NAME, PINNED) VALUES ( 5,1, \'asd\', 1)');

当我使用ionic cordova run browser 运行应用程序时,我得到一个白屏。当我使用ionic serve 运行它并捕获所有异常时(否则即使 db init 也不起作用)我收到错误 Cannot read property 'executeSql' of undefined

我做错了什么?我的插入代码工作in an online editor,所以我不认为它是SQL。

【问题讨论】:

  • 究竟是什么不起作用?数据库返回给您的错误是什么?
  • 当我使用ionic cordova run browser 运行应用程序时,我得到一个白屏。当我使用ionic serve 运行它并捕获所有异常(否则即使 db init 也不起作用)我收到错误 无法读取未定义的属性 'executeSql' 我编辑我的 QS 以包含它。

标签: sqlite typescript cordova visual-studio-code ionic4


【解决方案1】:

1 -> 安装 Cordova 和 Ionic Native 插件:
ionic cordova plugin add cordova-sqlite-storage
npm install --save @ionic-native/sqlite

2 -> 将此插件添加到您应用的模块中e
import {SQLite} from "@ionic-native/sqlite";
提供者:[ SQLite, ]

3 -> 在 AddItem 页面中导入:

 import {SQLite, SQLiteObject} from '@ionic-native/sqlite'; <br>
 constructor(private sqlite: SQLite);
 addItem() {
    this.sqlite.create({
        name: 'ionicdb.db',
        location: 'default'
    }).then((db: SQLiteObject) => {
        db.executeSql('INSERT INTO bikes VALUES(NULL,?,?,?,?,?)', [this.date, this.item.modal, this.item.company, this.item.color, this.imageString])
            .then((res) => {
                this.presentToast("Data Saved Successfully");
            })
            .catch((err) => {
                console.log('Error in SaveData------');
                console.log(JSON.stringify(err));
                this.presentToast("Error in SaveData");
            });
    }).catch((e) => {
        console.log("ERROR in SaveData:------");
        console.log(JSON.stringify(e));
        this.presentToast("ERROR in SaveData");
    });
    this.navCtrl.push(HomePage);
}

然后构建您的项目并在实际设备中运行。例如:Android 手机。
SQlite 需要实际设备才能正确执行..

这对我来说就像魅力一样。 希望这会对你有所帮助...... :)

【讨论】:

    【解决方案2】:

    您需要在真实设备上运行您的应用程序才能让 SQlite 资源正常工作,或者使用 IndexedDB 模式让它在浏览器上工作。 但是有一些技巧可以让 SQlite 在浏览器上运行,例如“Mocking SQLite native plugin”。还有其他的,比如“Ionic Native SQLite Storage — Browser”和“Ionic 3, Angular 4 and SQLite CRUD”。

    【讨论】:

      【解决方案3】:

      如果其他人发现自己在这里,我遇到了这个问题,但这是因为我在查询中使用了事务关键字,而不是 SQLite 插件的内置事务功能。

      即我在做:

      db.executeSql("BEGIN TRANSACTION; <MY DB SETUP>; COMMIT;",[])
      
      //Rather than
      db.transaction((tx) => tx.executeSql("<MY DB SETUB>",[]);
      
      

      这对我来说很顺利。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        相关资源
        最近更新 更多