Ionic module for database-builder library. Allowing integrate execute commands with SQLite ('@ionic-native/sqlite'), Web Sql, etc. Through the interface injection 'DatabaseCreatorContract' returning an implementation of 'DatabaseObject'.
npm install --save ionic-database-builder
This will install the current stable version of ionic-database-builder
in your node_modules
directory and save the entry in package.json
.
import { DatabaseModule, DatabaseSettingsFactoryDefault, MappersTableSimple } from 'ionic-database-builder'; import { DatabaseHelper } from 'database-builder'; @NgModule({ ... imports: [ DatabaseModule.forRoot( {// settings database: name, version and mapper useValue: // object to simple settings database new DatabaseSettingsFactoryDefault( 1, // version database "database1", // name database // mapper for database new MappersTableSimple(new DatabaseHelper(), { references: false, // if "true" generate column for serialize object reference to JSON. // Example in "TestClazz", create column "testClazzRef" to serialize "TestClazzRef" object referencesId: true, // if "true" generate column for id reference. // Example in "TestClazz", create column "testClazzRef_id" to save "TestClazzRef" property "id" referencesIdRecursive: false, // if "true" generate column for id reference recursive for all references inner. referencesIdColumn: "id" // name id column references }) .mapper( false, // readonly void 0, // keyColumn: default "id" void 0, // default settings constructor // Type models for mapper TestClazz, TestClazzRef )) }, {// is available database in context // As SQLite is only available on the platform cordova this is used to verify this parameter // useFactory: (platform: Platform) => { // return platform.is("cordova"); // }, // deps: [Platform], // or simply can pass true without conditions useValue: true }, { // Declare the implementation of 'DatabaseCreatorContract' that you want to use, you can include a proxy, use libraries with different signatures, or create mocks for tests, etc. useClass: SQLite }, { // Enable log SQL execute useValue: false }, // implementation of "DatabaseMigrationContract" to estrategy migration upgrade versions database DatabaseMigrationService ), ... ], ... }) export class AppModule { }
DatabaseMigrationService
import { Observable } from 'rxjs/Observable'; import { Injectable } from '@angular/core'; import { SQLiteTransaction } from '@ionic-native/sqlite'; import { Ddl } from 'database-builder'; import { DatabaseMigrationContract, Database, MappersTableBase } from 'ionic-database-builder'; import { Version } from 'ionic-database-builder/src/model/version-model'; @Injectable() export class DatabaseMigrationService extends DatabaseMigrationContract { // implemented of "DatabaseMigrationContract" public to(version: Version, transation: SQLiteTransaction, mappers: MappersTableBase): Observable<any>[] { let observablesNested: Observable<any>[] = []; if (version.oldVersion < 2.0) { observablesNested.push(this.migration_v2_0(transation, version, mappers)); } return observablesNested; } private migration_v2_0(transation: SQLiteTransaction, version: Version, mappers: MappersTableBase): Observable<any> { let observablesWait: Observable<any>[] = []; let ddl = new Ddl(transation, mappers, true); // drop tables deprecated observablesWait.push(Observable.fromPromise(ddl.drop(OldModel).execute())); // create new tables observablesWait.push(Observable.fromPromise(ddl.create(TestClazzRef).execute())); return Observable.forkJoin(observablesWait); } }
import { DatabaseModule } from 'ionic-database-builder'; @NgModule({ ... imports: [ DatabaseModule.forRoot( {// settings database: name, version and mapper useClass: DatabaseSettingsFactory }, {// is available database in context // As SQLite is only available on the platform cordova this is used to verify this parameter useFactory: (platform: Platform) => { return platform.is("cordova"); }, deps: [Platform], // // or simply can pass true without conditions // useValue: true }, { // Declare the implementation of 'DatabaseCreatorContract' that you want to use, you can include a proxy, use libraries with different signatures, or create mocks for tests, etc. useClass: SQLite }, { // Enable log SQL execute useValue: false }, // implementation of "DatabaseMigrationContract" to estrategy migration upgrade versions database DatabaseMigrationService ), ... ], ... }) export class AppModule { }
DatabaseSettingsFactory
import { EnvironmentService } from './../providers/environment-service'; import { Injector } from '@angular/core'; import { DatabaseSettingsFactoryContract, MappersTableBase } from "ionic-database-builder"; import { MappersTable } from './mappers-table'; export class DatabaseSettingsFactory extends DatabaseSettingsFactoryContract { databaseName(injector: Injector): string { let environmentService: EnvironmentService = injector.get(EnvironmentService); return `database_${environmentService.isProdution ? 'prod' : 'test'}`; } version(injector: Injector): number { return 2.0; } mapper(injector: Injector): MappersTableBase { return injector.get(MappersTable); } }
MappersTable
import { MappersTableSimple, DatabaseHelperService } from "ionic-database-builder"; import { Injectable } from "@angular/core"; @Injectable() export class MappersTable extends MappersTableSimple { constructor(_databaseHelper: DatabaseHelperService) { super( _databaseHelper, { references: false, referencesId: true, referencesIdRecursive: false, referencesIdColumn: void 0 } ); this.mapper(false, void 0, this._defaultSettings, // Type models for mapper TestClazz, TestClazzRef ); this.add(TestClazzAdvanced, false, void 0, { references: false, referencesId: false, referencesIdRecursive: false }, metadata => { metadata // add column reference1_id .mapper(x => x.reference1.id) // add column reference1_anything .mapper(x => x.reference1.anything); }); } }
DatabaseModule
provides the injection of Database
in its components and services, as can be seen in the following example:
MyApp
import { Database } from 'ionic-database-builder'; import { Component } from '@angular/core'; @Component({ templateUrl: 'app.html' }) export class MyApp { constructor( // inject "Database" database: Database ) { database.query(TestClazz).then(query => { query .select(x => x.description) .where(where => where.equal(x => x.id, 1)); console.log(query.compile()); /** * { * params: [1], * query: "SELECT tes.description AS description FROM TestClazz AS tes WHERE tes.id > ?" * } */ // to execute in database return promise with result query.toList(); }); } }