Ionic 3 SQLite: метод SQLiteObject executeSql () не работает - PullRequest
0 голосов
/ 02 сентября 2018

Что я сделал:

  1. Установлен ionic сегодня, командой npm install -g ionic и произнесением 'y' для интеграции с cordova.
  2. Установлено Cordova: npm install -g cordova
  3. Создан новый проект: ionic start sqlite3demo blank
  4. Установлено ионное хранилище:

    ionic cordova plugin add cordova-sqlite-storage

    npm install --save @ionic-native/sqlite

Теперь для кода. Я импортировал SQLite в app.module.ts так:

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { SQLite } from '@ionic-native/sqlite';

import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';

@NgModule({
  declarations: [
    MyApp,
    HomePage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    SQLite
  ]
})
export class AppModule {}

А затем я изменил домашнюю страницу по умолчанию следующим образом:

<ion-header>
  <ion-navbar>
    <ion-title>
      SQLite demo
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <ion-content>

    <button ion-button (click)="createTables()">Create db</button>
    <p>Result: {{ message }}</p>

  </ion-content>
</ion-content>

И, наконец, я изменил home.ts так:

import { Component } from '@angular/core';
import { NavController, Platform } from 'ionic-angular';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  message = '';
  db: SQLiteObject;

  constructor(private platform: Platform, public navCtrl: NavController, private sqlite: SQLite) {
    this.platform.ready().then(() => {
      this.sqlite.create({
        name: 'todos.db',
        location: 'default'
      })
        .then((db: SQLiteObject) => {
          this.message = JSON.stringify(db);
          this.db = db;
        });
    });
  }

  public createTables() {
    return this.db.executeSql(
      `CREATE TABLE IF NOT EXISTS list (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT
      );`)
      .then(() => this.message = 'OK')
      .catch((err) => this.message = "error detected creating tables -> " + JSON.stringify(err));
  }

}

После всего этого я выполняю ionic cordova run android, и я вижу JSON из db, но после этого я нажимаю кнопку, чтобы создать таблицу, и вместо того, чтобы увидеть «ОК», я вижу JSON из ошибка.

Start

After pressing the button

Что я сделал не так? Почему не работает?

РЕДАКТИРОВАТЬ: Версии, которые я использую:

"@ionic-native/sqlite": "^4.12.2",
"cordova-sqlite-storage": "^2.4.0"

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Наконец, как описано здесь , документация устарела. executeSql() работает, передавая [] в качестве второго параметра. Похоже, что команда Ionic Native не слишком задумывается об обновлении документации. Существуют и другие плагины с устаревшей документацией, например email composer, что заставляет разработчиков тратить много часов на решения, которые уже имеют решение.

0 голосов
/ 03 сентября 2018

Обратите внимание, что CREATE TABLE вызовет исключение, если таблица уже существует.
CREATE TABLE IF NOT EXISTS запрос создаст таблицу, если она не существует, иначе просто проигнорирует команду, выдав исключение.
Если вы все равно хотите создать таблицу, вам нужно удалить существующую таблицу, используя DROP TABLE IF EXISTS до CREATE TABLE IF NOT EXISTS.

...