我在 Ionic 3 App 中使用SqLite原生插件。 根据{{3}},它按预期工作。 在 app.commponent.ts 中,我创建了这样的表:
this.sqlite.create({
name: 'sdt.db',
location: 'default'
})
.then((db) => {
//create table if not exists!!!
this.db = db;
console.log(" within app components");
var createTableAccount = "CREATE TABLE IF NOT EXISTS 'accounts' ( 'accountid' INTEGER, 'accountName' TEXT NOT NULL, 'remarks' TEXT, 'initBalance' INTEGER NOT NULL, PRIMARY KEY('accountid') );"
this.db.transaction(function(tx) {
tx.executeSql(createTableAccount);
//todo: create a transaction table .........
//todo: insert data to table
}).then(() => {
console.log("basic structure sql executed")
//this.presentToast();
}).catch(e => console.log(e));;
});
在Home.ts 页面构造函数中,我使用过这样的
this.sqlite.create({
name: 'sdt.db',
location: 'default'
})
.then((db) => {
this.db = db;
});
在页面中:
ionViewDidLoad() {
this.loader = this.loading.create({
content: 'Loading ...',
cssClass: "loadingControllerCustomCss"
});
this.loader.present().then(() => {
this.getBalance();
});
}
详细方法是
getBalance() {
var balanceQuery = "select sum(trxamount) sumofamount from transactiontable";
this.db.executeSql(balanceQuery, [])
.then((data) => {
this.balance = data.rows.item(0).sumofamount;
}
)
.catch(e => console.log(e));
}
但我想创建一次表并重用 getBalance()方法,这样我就不必重复细分代码。因此,我想使用提供程序(示例 BackendService )作为可以重用于所有页面的服务方法。
什么是最佳做法?
任何机构都可以帮助完整的sqlite本机插件示例作为Ionic 3中的提供程序,其中将显示open database,create schema和get data?
先谢谢!
答案 0 :(得分:2)
确定首先需要安装本机插件,请参阅此处的说明:https://ionicframework.com/docs/native/sqlite/
完成后创建您的sqlite提供程序。通常在src中你做文件夹“providers”并添加sqlite.ts。
其内容:
import { Injectable } from '@angular/core';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite';
@Injectable()
export class SqLiteProvider {
// we need to declare a var that will point to the initialized db:
public db: SQLiteObject;
constructor(
private sqlite: SQLite
)
{
this.sqlite.create({
name: 'data.db',
location: 'default'
}).then((db: SQLiteObject) => {
// here we will assign created db to our var db (see above)
this.db = db;
// we can now create the table this way:
this.db.executeSql('create table danceMoves(name VARCHAR(32))', {})
.then(() => console.log('Executed SQL'))
.catch(e => console.log(e));
}).catch(e => console.log(e));
}
// here in this provider we create getBalance method, that should be accessible by other pages:
getBalance() {
// we will do Promise here:
return new Promise((resolve, reject) => {
let balanceQuery = "select sum(trxamount) sumofamount from transactiontable";
this.db.executeSql(balanceQuery, []).then((data) => {
let balance = data.rows.item(0).sumofamount;
// if we successfully obtain data - we resolve it, means it can be available via callback
resolve(balance)
}).catch((err)=>{ console.log(err); reject(err)}) // we deal with errors etc
})
}
}
如果您想在应用中的任何位置使用它,则需要创建此“全局范围”提供程序。为此,你去app.module.ts并导入:
从'../../providers/sqlite'导入{SqLiteProvider}; //确保这是您创建sqlite.ts的文件夹
现在,对于任何页面/组件,如果您需要使用此提供程序,您只需: - 导入它, - 然后使用构造函数初始化它。
//某个页面或组件:
从'../../providers/sqlite'导入{SqLiteProvider} ... 构造函数( private sqlProvider:SqLiteProvider ){}
现在,在此页面中,您可以通过
访问此提供程序的方法this.sqlProvider.getBalance()。then((data)=> {console.log(data)})。