Ionic2 sqlitePlugin未定义

时间:2016-11-17 11:16:16

标签: ionic2

如何规避此错误:VM18193:27无法打开数据库ReferenceError:未定义sqlitePlugin(...)

    setTimeout(function() {
      let db = new SQLite();
      db.openDatabase({
        name: "data.db",
        location: "default"
      }).then(() => {
        db.executeSql("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT)", {}).then((data) => {
          console.log("TABLE CREATED: ", data);

        }, (error) => {
          console.error("Unable to execute sql", error);
        })
      }, (error) => {
        console.error("Unable to open database", error);
      });
    }, 2000);

我如何执行某些查询?

if(SqlSettingsService.openDb){
      this.db = SqlSettingsService.getDB();
      this.db.executeSql("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT", {}).then
相反,我得到错误。 控制台:

SqlSettingsService() starts
VM21750:27 Unhandled Promise rejection: Cannot read property 'executeSql' of null ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'executeSql' of null(…) TypeError: Cannot read property 'executeSql' of null

1 个答案:

答案 0 :(得分:0)

插件sqlLite在浏览器中不起作用,您可以使用Websql代替浏览器(据我所知,使用兼容的浏览器,包括Chrome和Opera)。

为Websql编写的事务与为SQLite编写的事务兼容。

这是我管理连接到数据库的一项服务,无论程序是在浏览器还是在真实设备上运行,它都能正常运行:

import { Injectable } from '@angular/core';
import { SQLite } from 'ionic-native';
import { Platform } from 'ionic-angular';
import { Storage } from '@ionic/storage';

@Injectable()
export class SqlSettingsService {

    private db: any = null;
    private isOpened: boolean = false;


    constructor() { 
        console.log('SqlSettingsService() starts');
    }

    public getDB(){
        return this.db;
    }

    public openDb = (platform:Platform,winSer:any):Promise<any> => {
        console.log('SqlSettingsService() opend DB starts');
        let p:Promise<any>;
        if(!this.isOpened){
            this.isOpened = true;

            if(platform.is('core')){
                this.db = winSer.window.openDatabase("ionic2BrowserDev","1.0","",5*1024*1024);
                p = new Promise(function(resolve,reject){resolve('websql success')});
            } else {
                this.db = new SQLite();
                p = this.db.openDatabase({
                    name: 'data.db',
                    location: 'default' // the location field is required
                }).then(
                    ()=>{console.log("SqlSettingsService open db successful")},
                    (err)=>{console.error(err)}
                );
            }

        } else {
             p = new Promise(function(resolve,reject){
                resolve('db already opened');
             });
        }
        return p;

    }

    public closeDb = () => {
        this.isOpened = false;
        return this.db.close();
    }


}

当我在SqlSettingsService上调用openDB()时,winSer是另一个访问我在app.component.ts中使用的窗口Object的服务。它只是这个:

import { Injectable } from '@angular/core';

@Injectable()
export class WindowService {
  public window = window;
}

执行查询:

    [SqlSettingsService-instance].openDb();
[SqlSettingsSevice-instance].getDB().transaction(
            function(tx){
                tx.executeSql([your sql],[bracket values you want to pass],success,error);
                function success(tx,rs){
                     console.log("success exec sql: ")
                     console.info(rs);

                }
                function error(tx,error){
                     console.log('execSqlCustom error ' + error.message + " for tx " + tx);

                }
            });