SQLite с Ionic 4?Невозможно прочитать свойство then для неопределенного TypeError: Невозможно прочитать свойство then для неопределенного - PullRequest
0 голосов
/ 25 сентября 2018

Сначала у меня была эта ошибка , и я решил ее.Ок, отлично.Когда я пытаюсь выполнить отладку на моем устройстве (с ionic cordova run android).База данных SQL не загружается, она показывает, что ничего не имеет или никогда не создавала базу данных sqlite.Я проверяю в консоли, и я вижу это:

Ошибка ошибки: Uncaught (в обещании): TypeError: Невозможно прочитать свойство 'then' из> undefined TypeError: Невозможно прочитать свойство 'then' из undefined atAppComponent.push ../ src / app / app.component.ts.AppComponent.createDatabase> (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);
    });
  }

В 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]);
    }
  }
}

this.sqlite.create ({name: 'data.db', location: 'default'// поле местоположения обязательно }). then ((db: SQLiteObject) <--- Я думаю, что это ошибка, но я не знаю почему. </p>

Myинформация:

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

Любое решение? Кстати, я новичок, может быть, в коде что-то ускользает.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 04 июня 2019
ionic cordova platform add browser

, а затем

ionic cordova run browser

Мне пришлось выполнить 2-ю команду.С первой командой, Как это не строило для меня после первой команды.После этого все заработало.

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

Позволяет немного изменить ваш код:

private createDatabase(){
  const conn = this.sqlite.create({
    name: 'data.db',
    location: 'default' // the location field is required
  })
  console.log('i think the db conn is undefined', conn);
  conn.then(() => {
    // etc
  })
}

Здесь, если conn равно undefined, то вы пытаетесь вызвать undefined.then, что абсолютно бессмысленно.Вот почему вы получаете ошибку.Настоящая причина в том, что он не может создать ваше соединение с БД.Это совсем другая проблема.Было бы проще, если бы вы изменили свой код следующим образом:

private createDatabase(){
  const conn = this.sqlite.create({
    name: 'data.db',
    location: 'default' // the location field is required
  })
  if (conn == null) throw Error('Failed to create database connection')
  conn.then(() => {
    // etc
  })
}

Этот ранний поиск ошибок значительно упрощает отладку кода.

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

Я использую sqlite whit angular 6 и ionic v4, я думаю, что вы возвращаете весь объект базы данных немного грязно, вы бы выполняли все взаимодействия с базой данных в сервисе и возвращали только результаты.

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

@Injectable()
export class SQLiteService {

  constructor(
    private sqlite: SQLite
  ) {}

  rawQuery(queryText: string, params?: any[]): any {
    return new Promise((resolve, reject) => {
      this.sqlite.create({name: 'data.db', location: 'default'}).then((db: SQLiteObject) => {
        db.executeSql(queryText, params || []).then((data) => {
          resolve(data);
        }).catch(error => reject(error));
      }).catch(error => reject(error));
    });
  }
}
0 голосов
/ 25 сентября 2018

Я использую это в своем проекте, и это работает.Попробуйте и посмотрите, поможет ли это вам.

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);
  }  

}
...