Как использовать метод базы данных (плагин Sqlite) в качестве провайдера в Ionic 3?
Я использую родной плагин SqLite в приложении Ionic 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 native в качестве провайдера в Ionic 3, где будут показаны открытая база данных, создание схемы и получение данных?
Спасибо за преимущество!
1 ответ
Хорошо, сначала вам нужно установить собственные плагины, см. Инструкции здесь: https://ionicframework.com/docs/native/sqlite/
После этого создайте свой провайдер sqlite. Обычно внутри src вы делаете папку "поставщики" и добавляете 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 и импортируете:
импортировать { SqLiteProvider } из '../../providers/sqlite'; // убедитесь, что это папка, в которой вы создали свой sqlite.ts
Теперь для любой страницы / компонента, если вам нужно использовать этого провайдера, вы просто: - импортируете его, - затем используете конструктор для его инициализации.
// какая-то страница или компонент:
import { SqLiteProvider } из конструктора '../../providers/sqlite' ... (частный sqlProvider: SqLiteProvider) {}
Теперь на этой странице вы можете получить доступ к методам этого провайдера, выполнив
this.sqlProvider.getBalance().then((данные)=>{ console.log(данные)}).