-
-
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'); | |
} | |
} |
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)
@andytudhope I'm also getting same error, found any solution?
Thank you
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();
}
}
Thank you very much! Great job!
thank you