SQLite 与 Ionic 4?无法读取未定义的属性“then” TypeError:无法读取未定义的属性“then”

Tom*_*mas 5 sqlite android-sqlite ionic-framework angular ionic4

首先我遇到了这个错误并解决了它。太好了。当我尝试使用我的设备进行调试时(使用ionic cordova run android)。数据库 SQL 未加载,它显示为没有或从未创建过数据库 sqlite。我检查控制台,我看到这个:

错误错误:未捕获(承诺):TypeError:无法读取 >undefined TypeError 的属性“then”:无法读取 AppComponent.push../src/app/app.component.ts.AppComponent.createDatabase 处未定义的属性“then” >(app.component.ts:101) 在 app.component.ts:87

在 app.component.ts 我有这个:

import { SQLite, SQLiteObject } from '@ionic-native/sqlite/ngx';
import { DbService } from './services/db/db.service';


rootPage: string = null;
constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private translate: TranslateService,
    private router: Router,
    private menuCtrl: MenuController,
    public DbService: DbService,
    public sqlite: SQLite
    //private screenOrientation: ScreenOrientation
  ) {
    this.initializeApp();
  }

  public TableCreated = "POR EL MOMENTO NO";
  public ahora = "ahora";

  initializeApp() {
    this.platform.ready().then(() => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();
      this.translate.setDefaultLang('en');
      this.createDatabase();

    });
  }

  closeMenu() {
    this.menuCtrl.close();
  }

  private createDatabase(){
    this.sqlite.create({
      name: 'data.db',
      location: 'default' // the location field is required
    }).then((db: SQLiteObject) => {  <<<<----- ERROR HERE !!! but I don't know why.
      this.TableCreated = "FUE CREADA LA DB!";
      this.DbService.setDatabase(db);
      return this.DbService.createTable();
    })
    .then(() => {
      this.TableCreated = "FUE CREADA LA TABLA!";
      return this.DbService.createFirstRunningApp();
    })
    .then(() =>{
      this.TableCreated = "SE INSERTÓ LOS DATOS";
      this.splashScreen.hide();
      this.rootPage = 'HomePage';
    })
    .catch(error =>{
      console.error(error);
    });
  }
Run Code Online (Sandbox Code Playgroud)

在 db.services.ts 中:

import { SQLiteObject } from '@ionic-native/sqlite/ngx';


export class DbService {
db: SQLiteObject = null;

  constructor() { }

 setDatabase(db: SQLiteObject){
    if(this.db === null){
      this.db = db;
    }
  }

  createTable(){
    let sql = 'CREATE TABLE IF NOT EXISTS datis(id INTEGER PRIMARY KEY AUTOINCREMENT, dati TEXT, isTrue INTEGER DEFAULT 0, dateCreated datetime default CURRENT_TIMESTAMP)';
    return this.db.executeSql(sql, []);

  }

  createFirstRunningApp(){ //solo la primera vez se corre
    let allDate = [
      'Blablabla',
      'Something',
      'YellowBlueRed',
    ];
    let sql = 'INSERT INTO datis(dati) VALUES(?)';
    for (let dati of allDate) {
      this.db.executeSql(sql, [dati]);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

this.sqlite.create({ name: 'data.db', location: 'default' // location 字段是必需的 }).then((db: SQLiteObject) <--- 我认为这是错误,但我不知道为什么。

我的信息:

Ionic:

   ionic (Ionic CLI)          : 4.1.2 (C:\Users\Tomas\AppData\Roaming\npm\node_m
odules\ionic)
   Ionic Framework            : @ionic/angular 4.0.0-beta.7
   @angular-devkit/core       : 0.7.5
   @angular-devkit/schematics : 0.7.5
   @angular/cli               : 6.1.5
   @ionic/ng-toolkit          : 1.0.8
   @ionic/schematics-angular  : 1.0.6

Cordova:

   cordova (Cordova CLI) : 8.0.0
   Cordova Platforms     : android 7.0.0
   Cordova Plugins       : cordova-plugin-ionic-keyboard 2.1.3, cordova-plugin-i
onic-webview 2.1.4, (and 4 other plugins)

System:

   NodeJS : v8.12.0 (C:\Program Files\nodejs\node.exe)
   npm    : 6.4.1
   OS     : Windows 7
Run Code Online (Sandbox Code Playgroud)

有什么解决办法吗?为了记录,我是一个初学者,也许代码中有些东西逃逸了。

谢谢。

小智 8

ionic cordova platform add browser
Run Code Online (Sandbox Code Playgroud)

进而

ionic cordova run browser
Run Code Online (Sandbox Code Playgroud)

我不得不运行第二个命令。使用第一个命令,因为在第一个命令后它没有为我构建。在此之后,它起作用了。


小智 0

我在我的项目中使用了这个,并且它有效。尝试看看是否对您有帮助。

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

@Injectable()
export class SqliteHelperService {

  private db: SQLiteObject

  constructor(
    public platform: Platform,
    public sqlite: SQLite) {
  }

  
  private createDatabase(dbName?:string): Promise<SQLiteObject> {
    return this.platform.ready()
      .then((readySource: string) => {
        return this.sqlite.create({ 
          name: dbName || 'ks.db',
          location: 'default'
        }).then((db: SQLiteObject) => {
          this.db = db;
          return this.db;
        }).catch((error: Error) => {
          console.log('Error on open or create database: ', error);
          return Promise.reject(error.message || error);
        });  
      });  
  }

  getDb(dbName?:string, newOpen?:boolean): Promise<SQLiteObject>{
    if (newOpen) return this.createDatabase(dbName);
    return (this.db) ? Promise.resolve(this.db) : this.createDatabase(dbName);
  }  

}
Run Code Online (Sandbox Code Playgroud)