简体   繁体   中英

How to use Sqlite with ionic 2 rc.0?

I would like to know how to use Sqlite with Ionic 2 rc.o release.I am finding it difficult as there are no examples for the latest version release and i am stuck.Nothing on the net seems to be updated.A supporting example for Sqlite would be of great use. Thank you in advance.

1) First of all, navigate to the root folder of your project and add the plugin:

$ ionic plugin add cordova-sqlite-storage
$ npm install --save @ionic-native/sqlite

2) Create a new provider inside the project (in this example, called SqlStorage ):

$ ionic g provider sqlStorage

3) I'd like to add an import to app.component.ts to initialize the plugin at startup, not mandatory:

import {SqlStorage} from '../providers/sql-storage';
...
...
constructor(public sqlStorage: SqlStorage){}

4) Add entry to app.module.ts , mandatory:

import { SQLite } from '@ionic-native/sqlite';
import { SqlStorage } from '../providers/sql-storage';
...
...
providers: [SQLite, SqlStorage]

5) Define the sql-storage.ts provider:

import { Injectable } from '@angular/core';
import { Platform } from 'ionic-angular';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite';

@Injectable()
export class SqlStorage {

    storage: any;
    DB_NAME: string = '__ionicstorage';

    constructor(public platform: Platform, public sqlite: SQLite) {

        this.platform.ready().then(() => {

            this.sqlite.create({ name: this.DB_NAME, location: 'default' })
                .then((db: SQLiteObject) => {
                    this.storage = db;
                    this.tryInit();
            });
        });
    }

    tryInit() {
        this.query('CREATE TABLE IF NOT EXISTS kv (key text primary key, value text)')
        .catch(err => {
            console.error('Unable to create initial storage tables', err.tx, err.err);
        });
    }

    /**
     * Perform an arbitrary SQL operation on the database. Use this method
     * to have full control over the underlying database through SQL operations
     * like SELECT, INSERT, and UPDATE.
     *
     * @param {string} query the query to run
     * @param {array} params the additional params to use for query placeholders
     * @return {Promise} that resolves or rejects with an object of the form 
     * { tx: Transaction, res: Result (or err)}
     */
    query(query: string, params: any[] = []): Promise<any> {
        return new Promise((resolve, reject) => {
            try {
                this.storage.transaction((tx: any) => {
                        tx.executeSql(query, params,
                            (tx: any, res: any) => resolve({ tx: tx, res: res }),
                            (tx: any, err: any) => reject({ tx: tx, err: err }));
                    },
                    (err: any) => reject({ err: err }));
            } catch (err) {
                reject({ err: err });
            }
        });
    }

    /** GET the value in the database identified by the given key. */
    get(key: string): Promise<any> {
        return this.query('select key, value from kv where key = ? limit 1', [key])
        .then(data => {
            if (data.res.rows.length > 0) {
                return data.res.rows.item(0).value;
            }
        });
    }

    /** SET the value in the database for the given key. */
    set(key: string, value: string): Promise<any> {
        return this.query('insert into kv(key, value) values (?, ?)', [key, value]);
    }

    /** REMOVE the value in the database for the given key. */
    remove(key: string): Promise<any> {
        return this.query('delete from kv where key = ?', [key]);
    }
}

6) In your .ts page:

import {SqlStorage} from '../../providers/sql-storage';

export class ExamplePage {
    constructor(public sqlStorage: SqlStorage) {
        // this.sqlStorage.query(...);
        // this.sqlStorage.get(key).then(data => {
        //    console.log(data);   
        // }
        //...
    }
}

Credit to: https://github.com/NickStemerdink with some personal changes. Hope it will help and works fine :)

EDIT: Still works fine with Ionic v3.0.1 (2017-04-06)

in app.module.ts

import { SQLite } from '@ionic-native/sqlite';

 providers: [
        StatusBar,
        SplashScreen,
        SQLite,
        { provide: ErrorHandler, useClass: IonicErrorHandler }
    ]

in database provider

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
//import { Storage } from '@ionic/storage';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite';
import { Platform } from 'ionic-angular';

/*
  Generated class for the Database provider.

  See https://angular.io/docs/ts/latest/guide/dependency-injection.html
  for more info on providers and Angular 2 DI.
*/
@Injectable()
export class Database {

    DB_NAME: string = 'ssddb';

    constructor(public http: Http, public platform: Platform, public sqlite: SQLite) {
        this.platform.ready().then(() => {
            this.configureDatabase();
        });
    }

    configureDatabase() {
        this.query('CREATE TABLE IF NOT EXISTS EMP (key text primary key, value text)')
            .catch(err => {
                console.error('Unable to create initial storage tables', err.tx, err.err);
            });
    }

    query(query: string, params: any[] = []): Promise<any> {
        return new Promise((resolve, reject) => {
            try {
                this.sqlite.create({
                    name: this.DB_NAME,
                    location: 'default'
                })
                    .then((db: SQLiteObject) => {
                        db.transaction((tx: any) => {
                            tx.executeSql(query, params,
                                (tx: any, res: any) => resolve({ tx: tx, res: res }),
                                (tx: any, err: any) => reject({ tx: tx, err: err }));
                        })
                    })
                    .catch(e => console.log(e));
            } catch (err) {
                reject({ err: err });
            }
        });
    }

    get(key: string): Promise<any> {
        return this.query('select key, value from EMP where key = ? limit 1', [key])
            .then(data => {
                if (data.res.rows.length > 0) {
                    return data.res.rows.item(0).value;
                }
            });
    }

    set(key: string, value: string): Promise<any> {
        return this.query('insert into EMP(key, value) values (?, ?)', [key, value]);
    }

}

in page.ts

        this.database.set("333","ss");

 this.database.get("333").then(data => {
            console.log(data);
            let toast = this.toastCtrl.create({
                message: data,
                duration: 10000,
                position: 'bottom'
            });
            toast.present();
        });

On ionic-storage repo they say to use Ionic Native SQLite plugin . So like this:

import { SQLite } from 'ionic-native';

SQLite.openDatabase({
  name: 'data.db',
  location: 'default'
})
  .then((db: SQLite) => {

    db.executeSql('create table danceMoves(name VARCHAR(32))', {}).then(() => {}).catch(() => {});

  })
  .catch(error => console.error('Error opening database', error));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM