Skip to content

Instantly share code, notes, and snippets.

@NickStemerdink
Last active August 15, 2019 19:23
Show Gist options
  • Save NickStemerdink/64c782807fc31b7bc9b529ad4b1d56d5 to your computer and use it in GitHub Desktop.
Save NickStemerdink/64c782807fc31b7bc9b529ad4b1d56d5 to your computer and use it in GitHub Desktop.
providers: [
Sql
]
import {Sql} from "../providers/Sql";
export class ExamplePage {
constructor(private sql: Sql) {
//sql.query(...);
//...
}
}
import {Injectable} from "@angular/core";
const DB_NAME: string = '__ionicstorage';
const win: any = window;
@Injectable()
export class Sql {
private _db: any;
constructor() {
if (win.sqlitePlugin) {
this._db = win.sqlitePlugin.openDatabase({
name: DB_NAME,
location: 2,
createFromLocation: 0
});
} else {
console.warn('Storage: SQLite plugin not installed, falling back to WebSQL. Make sure to install cordova-sqlite-storage in production!');
this._db = win.openDatabase(DB_NAME, '1.0', 'database', 5 * 1024 * 1024);
}
this._tryInit();
}
// Initialize the DB with our required tables
_tryInit() {
this.query('CREATE TABLE IF NOT EXISTS kv (key text primary key, value text)').catch(err => {
console.error('Storage: 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._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 }));
},
(err: any) => reject({ err: err }));
} catch (err) {
reject({ err: err });
}
});
}
/**
* Get the value in the database identified by the given key.
* @param {string} key the key
* @return {Promise} that resolves or rejects with an object of the form { tx: Transaction, res: Result (or err)}
*/
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. Existing values will be overwritten.
* @param {string} key the key
* @param {string} value The value (as a string)
* @return {Promise} that resolves or rejects with an object of the form { tx: Transaction, res: Result (or err)}
*/
set(key: string, value: string): Promise<any> {
return this.query('insert or replace into kv(key, value) values (?, ?)', [key, value]);
}
/**
* Remove the value in the database for the given key.
* @param {string} key the key
* @return {Promise} that resolves or rejects with an object of the form { tx: Transaction, res: Result (or err)}
*/
remove(key: string): Promise<any> {
return this.query('delete from kv where key = ?', [key]);
}
/**
* Clear all keys/values of your database.
* @return {Promise} that resolves or rejects with an object of the form { tx: Transaction, res: Result (or err)}
*/
clear(): Promise<any> {
return this.query('delete from kv');
}
}
@juliandavidmr
Copy link

Me has salvado la vida. gracias :)

@riverajefer
Copy link

thank you

@andytudhope
Copy link

Hi Nick. Thanks for this. It works well in the browser and falls back as expected, but am now trying to run it on my android device and debugging remotely in chrome and I think that first if statement is not firing, so it's not creating the db at all. This is the error I get in the console:

Storage: Unable to create initial storage tables undefined TypeError: n._db.transaction is not a function and after much poking around, I think it is because win.sqlitePlugin is not firing (replacing win with the full window gets me red lines in VS)

@aggarwalankush
Copy link

@andytudhope I'm also getting same error, found any solution?

@fjms
Copy link

fjms commented Nov 28, 2016

Thank you

@fjms
Copy link

fjms commented Nov 28, 2016

@andytudhope @aggarwalankush


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

const DB_NAME: string = '__ionicstorage';
const win: any = window;

@Injectable()
export class StorageService {

private _db: any;
constructor(private platform: Platform) {
  if (this.platform.is('cordova')) {
   this._db = new SQLite();
   this._db.openDatabase({
     name: DB_NAME,
     location: 'default' // the location field is required
   }).then(() => {
     this._tryInit();
   });
  } else {
   console.warn('Storage: SQLite plugin not installed, falling back to WebSQL. Make sure to install cordova-sqlite-storage in production!');
   this._db = win.openDatabase(DB_NAME, '1.0', 'database', 5 * 1024 * 1024);
   this._tryInit();
  }
}

@bsysop
Copy link

bsysop commented Nov 6, 2018

Thank you very much! Great job!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment