Как использовать метод базы данных (плагин 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(данные)}).

Другие вопросы по тегам