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<、、、、 上不存在属性“项目”,