ionic3项目中的'SQLite'类型上不存在错误属性'openDatabase'?

Posted

技术标签:

【中文标题】ionic3项目中的\'SQLite\'类型上不存在错误属性\'openDatabase\'?【英文标题】:Getting error Property 'openDatabase' does not exist on type 'SQLite' in ionic3 project?ionic3项目中的'SQLite'类型上不存在错误属性'openDatabase'? 【发布时间】:2018-01-21 09:25:26 【问题描述】:

我的错误:

未捕获的运行时错误(承诺中):TypeError: _this.sqlstorage.openDatabase is not a function TypeError: _this.sqlstorage.openDatabase is not a function at http://localhost:8100/build/main.js:67:30 at t.invoke (http://localhost:8100/build/polyfills.js:3:9283) 在 Object.onInvoke (http://localhost:8100/build/vendor.js:4508:37) 在 t.invoke (http://localhost:8100/build/polyfills.js:3:9223) 在 r.run (http://localhost:8100/build/polyfills.js:3:4452) 在 http://localhost:8100/build/polyfills.js:3:14076 在 t.invokeTask (http://localhost:8100/build/polyfills.js:3:9967) 在 Object.onInvokeTask (http://localhost:8100/build/vendor.js:4499:37) 在 t.invokeTask (http://localhost:8100/build/polyfills.js:3:9888) 在 r.runTask (http://localhost:8100/build/polyfills.js:3:5143)

堆栈

错误:未捕获(承诺):TypeError:_this.sqlstorage.openDatabase is not a function TypeError: _this.sqlstorage.openDatabase is not a 功能 在http://localhost:8100/build/main.js:67:30 在 t.invoke (http://localhost:8100/build/polyfills.js:3:9283) 在 Object.onInvoke (http://localhost:8100/build/vendor.js:4508:37) 在 t.invoke (http://localhost:8100/build/polyfills.js:3:9223) 在 r.run (http://localhost:8100/build/polyfills.js:3:4452) 在http://localhost:8100/build/polyfills.js:3:14076 在 t.invokeTask (http://localhost:8100/build/polyfills.js:3:9967) 在 Object.onInvokeTask (http://localhost:8100/build/vendor.js:4499:37) 在 t.invokeTask (http://localhost:8100/build/polyfills.js:3:9888) 在 r.runTask (http://localhost:8100/build/polyfills.js:3:5143) 在 c (http://localhost:8100/build/polyfills.js:3:13535) 在http://localhost:8100/build/polyfills.js:3:14107 在 t.invokeTask (http://localhost:8100/build/polyfills.js:3:9967) 在 Object.onInvokeTask (http://localhost:8100/build/vendor.js:4499:37) 在 t.invokeTask (http://localhost:8100/build/polyfills.js:3:9888) 在 r.runTask (http://localhost:8100/build/polyfills.js:3:5143) 在 o (http://localhost:8100/build/polyfills.js:3:2203) 在 htmlDocument.invoke (http://localhost:8100/build/polyfills.js:3:10985)

我的 Home.ts 文件:

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

@Component(
  selector: 'page-home',
  templateUrl: 'home.html'
)
export class HomePage 
    sqlstorage: SQLite;
    items: Array<Object>;

  constructor(public navCtrl: NavController, private platform: Platform) 
     this.platform.ready().then(() => 
            for (var i = 100000 - 1; i >= 0; i--) 
                console.log("test");
                    
            this.sqlstorage = new SQLite();
            this.sqlstorage.openDatabase(name: "items.db", location: "default").then(() => 
                this.createTables();
                this.findAll();
            , (err) => 
                console.log("!!! ", err);
            );
        );

  

  public createTables()
        this.sqlstorage.executeSql(`create table if not exists items(
            reference CHAR(10) PRIMARY KEY,
            name CHAR(30),
            qMin FLOAT,
            qReal FLOAT
        ))`, );            
    

Ionic 版本详情

离子框架:3.6.0

Ionic 应用脚本:2.1.3

Angular 核心:4.1.3

Angular 编译器 CLI:4.1.3

节点:8.2.1

操作系统平台:Linux 4.4

导航平台:Linux x86_64

用户代理:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36

我试过了:

 npm install --save @ionic-native/sqlite

但没有帮助。

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:
/* This is sqlite object */
  public database: SQLiteObject;

/* This will notify when platform is ready and database is ready to trasction */
private databaseReady: BehaviorSubject<boolean>;

private options =  name: 'test.db', location: 'default' ;

this.databaseReady = new BehaviorSubject(false);
    this.platform.ready().then(() => 
      console.log(this.TAG, 'platform is ready');
      this.sqlite.create(this.options)
      .then((db: SQLiteObject) => 
       this.database = db;
       console.log(this.TAG, this.database);
       this.databaseReady.next(true);
       db.executeSql('select tbl_name from sqlite_master', []).then(data => 
         console.log(this.TAG, data);
         ).catch(e => console.log(e));
      );
    ).catch(e => console.log(e));
   
  public getDatabaseState() 
    return this.databaseReady.asObservable();
  

//On your page ts file

this.database.getDatabaseState().subscribe(result => 
      console.log(this.TAG, 'Database State', result);
        if (result) 

        
);

【讨论】:

【参考方案2】:

您应该将SQLite 注入您的constructor。而SQLite 似乎没有一个名为openDatabase() 的函数。 documentation 表示使用函数 create(config:SQLiteDatabaseConfig) 创建或打开数据库。

...

private db: SQLiteObject;

constructor(private sqlite: SQLite, private platform: Platform) 
    platform.ready().then(() => 
        sqlite.create(
            name: "items.db",
            location: "default"
        )
        .then(db => 
            this.db = db;
            this.createTables();
        
    );


createTables()
    this.db.executeSql(...);


...

【讨论】:

是不是表示,.then(db => this.db = db; this.createTables(); 将用于加载当前数据库? 你能告诉我你是如何导入 SQLite 的吗?因为我收到了'SQLite' refers to a value, but is being used as a type here. Did you mean 'typeof SQLite'? 好的,确实找到了,我必须像这样导入它import SQLite from '@ionic-native/sqlite/ngx'

以上是关于ionic3项目中的'SQLite'类型上不存在错误属性'openDatabase'?的主要内容,如果未能解决你的问题,请参考以下文章

ionic-native sqlite 插件5.x版的在ionic3.x上报错 cannot read property 'split' of undefined

react+ts 项目:ts(2322),类型“Readonly<{}>”上不存在属性“day”。ts(2339) 解决办法

react+ts 项目:ts(2322),类型“Readonly<{}>”上不存在属性“day”。ts(2339) 解决办法

Vue js 3 - 类型“CreateComponentPublicInstance<、、、、 上不存在属性“项目”,

ionic3 打包安卓平台环境搭建报错解决方案总结

Angular 4 属性在构建时类型对象上不存在