Ionic:SQL Lite Insert Into Statement 不起作用

Ionic: SQL Lite Insert Into Statement does not work

我正在尝试使用 Ionic. I want to use a SQL Lite db with the help of some articles on SQL Lite and Ionic and Ionic and Cordova from browser 创建一个简单的 Android 应用程序。我设法使用 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 精简版插入不起作用:

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 属性 'executeSql' of未定义

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

您需要 运行 在真实设备中运行您的应用程序才能使 SQlite 资源正常运行,或者使用 IndexedDB 模式使其在浏览器上运行。 但是有一些技巧可以在浏览器上获取 SQlite 运行ning,例如“Mocking SQLite native plugin". And others like "Ionic Native SQLite Storage — Browser" and also "Ionic 3, Angular 4 and SQLite CRUD”。

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";
供应商:[ 数据库, ]

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 Phone.
SQlite 需要实际设备才能正确执行..

这对我来说很有魅力。 希望这对您有所帮助...:)

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

即我在做:

db.executeSql("BEGIN TRANSACTION; <MY DB SETUP>; COMMIT;",[])

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

这对我很有帮助。