Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 573
Hrishikesh Kulkarni Avatar asked Feb 06 '23 20:02

Hrishikesh Kulkarni


1 Answers

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)

like image 90
mosca90 Avatar answered Feb 23 '23 03:02

mosca90