• Stars
    star
    389
  • Rank 106,416 (Top 3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 7 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Ionic Storage module for Ionic apps

Build Status

Ionic Storage

A simple key-value Storage module for Ionic apps. This utility uses the best storage engine available on the platform without having to interact with it directly (some configuration required, see docs below).

As of 3.x, this library now supports any JavaScript project (old versions only supported Angular), and Angular-specific functionality has been moved to a new @ionic/storage-angular package.

Out of the box, Ionic Storage will use IndexedDB and localstorage where available. To use SQLite for native storage, see the SQLite Installation instructions.

For teams building security sensitive applications requiring encryption, 3.x now supports encryption through Ionic Secure Storage, see Encryption Support for instructions on using it.

Installation

npm install @ionic/storage

If using Angular, install the @ionic/storage-angular library instead:

npm install @ionic/storage-angular

If you'd like to use SQLite as a storage engine, see the SQLite Installation instructions.

Usage

With React, Vue, Vanilla JavaScript

import { Storage } from '@ionic/storage';

const store = new Storage();
await store.create();

See the API section below for an overview of the supported methods on the storage instance.

With Angular

Usage in Angular using Services and Dependency Injection requires importing the IonicStorageModule and then injecting the Storage class.

First, edit your NgModule declaration in src/app/app.module.ts or in the module for the component you'll use the storage library in, and add IonicStorageModule as an import:

import { IonicStorageModule } from '@ionic/storage-angular';

@NgModule({
  imports: [
    IonicStorageModule.forRoot()
  ]
})
export class AppModule { }

Next, inject Storage into a component. Note: this approach is meant for usage in a single component (such as AppComponent). In this case, create() should only be called once. For use in multiple components, we recommend creating a service (see next example).

import { Component } from '@angular/core';
import { Storage } from '@ionic/storage-angular';

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html'
})
export class AppComponent {

  constructor(private storage: Storage) {
  }

  async ngOnInit() {
    // If using a custom driver:
    // await this.storage.defineDriver(MyCustomDriver)
    await this.storage.create();
  }
}

For more sophisticated usage, an Angular Service should be created to manage all database operations in your app and constrain all configuration and database initialization to a single location. When doing this, don't forget to register this service in a providers array in your NgModule if not using providedIn: 'root', and ensure that the IonicStorageModule has been initialized in that NgModule as shown above. Here's an example of what this service might look like:

import { Injectable } from '@angular/core';

import { Storage } from '@ionic/storage-angular';

@Injectable({
  providedIn: 'root'
})
export class StorageService {
  private _storage: Storage | null = null;

  constructor(private storage: Storage) {
    this.init();
  }

  async init() {
    // If using, define drivers here: await this.storage.defineDriver(/*...*/);
    const storage = await this.storage.create();
    this._storage = storage;
  }

  // Create and expose methods that users of this service can
  // call, for example:
  public set(key: string, value: any) {
    this._storage?.set(key, value);
  }
}

Then, inject the StorageService into your pages and other components that need to interface with the Storage engine.

API

The Storage API provides ways to set, get, and remove a value associated with a key, along with clearing the database, accessing the stored keys and their quantity, and enumerating the values in the database.

To set an item, use set(key, value):

await storage.set('name', 'Mr. Ionitron');

To get the item back, use get(name):

const name = await storage.get('name');

To remove an item:

await storage.remove(key);

To clear all items:

await storage.clear();

To get all keys stored:

await storage.keys()

To get the quantity of key/value pairs stored:

await storage.length()

To enumerate the stored key/value pairs:

storage.forEach((key, value, index) => {
});

To enable encryption when using the Ionic Secure Storage driver:

storage.setEncryptionKey('mykey');

See Encryption Support below for more information.

Configuration

The Storage engine can be configured both with specific storage engine priorities, or custom configuration options to pass to localForage. See the localForage config docs for possible options: https://github.com/localForage/localForage#configuration

In React/Vue/Vanilla JavaScript configuration

Pass configuration options in the Storage constructor:

const storage = new Storage({
  name: '__mydb',
  driverOrder: [Drivers.IndexedDB, Drivers.LocalStorage]
});

Angular configuration

import { Drivers, Storage } from '@ionic/storage';
import { IonicStorageModule } from '@ionic/storage-angular';

@NgModule({
  //...
  imports: [
   IonicStorageModule.forRoot({
     name: '__mydb',
     driverOrder: [Drivers.IndexedDB, Drivers.LocalStorage]
   })
 ],
 //...
})
export class AppModule { }

SQLite Installation

The 2.x version of this plugin hard coded in the localForage-cordovaSQLiteDriver. This driver has been removed from the core code as of 3.x to provide more options for SQLite storage engines.

In 3.x there are at least two good options for SQLite usage:

  1. For non-enterprise apps, the old localForage-cordovaSQLiteDriver is still a fine choice but does not support encryption and is community maintained. See below for installation instructions.

  2. For enterprise apps, we strongly recommend Ionic Secure Storage which is an enterprise SQLite engine with full encryption support out of the box and is fully supported and maintained by the Ionic team.

Using localForage-CordovaSQLiteDriver

Installation

# If using Cordova, install the plugin using 
ionic cordova plugin add cordova-sqlite-storage
# If using Capacitor, install the plugin using
npm install cordova-sqlite-storage

# Then, install the npm library
npm install localforage-cordovasqlitedriver

Adding driver to configuration

For non-Angular projects, pass the CordovaSQLiteDriver._driver to the driverOrder config option:

import CordovaSQLiteDriver from 'localforage-cordovasqlitedriver';

const store = new Storage({
  driverOrder: [CordovaSQLiteDriver._driver, Drivers.IndexedDB, Drivers.LocalStorage]
});

In Angular, pass the same configuration when importing the IonicStorageModule in your page or app NgModule:

import CordovaSQLiteDriver from 'localforage-cordovasqlitedriver';

@NgModule({
  imports: [
    // ...,
    IonicStorageModule.forRoot({
      driverOrder: [CordovaSQLiteDriver._driver, Drivers.IndexedDB]
    })
  ],
  // ...
})
export class MyPageModule { }

Registering Driver

Finally, to register the driver, run defineDriver() on the storage instance to register the driver, making sure to call this before any data operations:

import CordovaSQLiteDriver from 'localforage-cordovasqlitedriver'

const store = new Storage({
  driverOrder: [CordovaSQLiteDriver._driver, Drivers.IndexedDB, Drivers.LocalStorage]
});

await this.storage.defineDriver(CordovaSQLiteDriver);

Using Ionic Secure Storage

Ionic Secure Storage is an enterprise-ready, high-performance data store with SQL or key/value support and offering 256-bit AES encryption. When used in tandem with Ionic Identity Vault, developers can securely manage encryption keys and build fully offline-enabled apps with biometric authentication using the fullest security capabilities available on modern mobile devices and operating systems.

Ionic Secure Storage is an enterprise product and requires an active enterprise subscription or trial. To learn more and request a demo, visit the Secure Storage product page.

Installation

Follow the official installation guide to set up and install @ionic-enterprise/secure-storage.

Usage

With React, Vue, Vanilla JavaScript

import { Drivers } from '@ionic/storage';
import IonicSecureStorageDriver from '@ionic-enterprise/secure-storage/driver';

const store = new Storage({
  driverOrder: [Drivers.SecureStorage, Drivers.IndexedDB, Drivers.LocalStorage]
});

await store.defineDriver(IonicSecureStorageDriver);

With Angular

Usage in Angular using Services and Dependency Injection requires importing the IonicStorageModule and then injecting the Storage class.

First, edit your NgModule declaration in src/app/app.module.ts or in the module for the page you'll use the storage library in, and add IonicStorageModule as an import:

import { Drivers } from '@ionic/storage';
import { IonicStorageModule } from '@ionic/storage-angular';

@NgModule({
  declarations: [
    ...
  ],
  imports: [
    IonicStorageModule.forRoot({
      driverOrder: [Drivers.SecureStorage, Drivers.IndexedDB, Drivers.LocalStorage]
    })
  ],
  // ...
})
export class AppModule { }

Then register the driver in your component:

  async ngOnInit() {
    await this.storage.defineDriver(IonicSecureStorageDriver);
    await this.storage.create();
  }

Then follow the instructions below to configure encryption support:

Encryption Support

3.x adds a new method setEncryptionKey to support encryption when using with Ionic Secure Storage (see instructions above).

This is an enterprise feature for teams with high security needs and provides the ability to use the simple @ionic/storage key-value API, or drop down to SQL for more powerful query and relational data support, all with full encryption. When paired with Ionic Identity Vault teams can safely manage encryption keys and provide biometric authentication when on or offline.

Visit the Secure Storage product page to learn more about Secure Storage and inquire about a trial.

Encrypting an Existing SQLite Database

A one-time migration must be performed to move to a new, encrypted database powered by Ionic Secure Storage.

First, follow the installation steps above to update to Ionic Storage v3, install the localForage-CordovaSQLiteDriver SQLite driver, and integrate Ionic Secure Storage.

Next, remove the database name and drivers, if used, from app.module.ts:

@NgModule({
  imports: [
    // ...,
    IonicStorageModule.forRoot()
  ],
  // ...
})
export class MyPageModule { }

Finally, in the service class, create a one time migration function that migrates data to an encrypted database. Execute this function on app load.

async migrateDatabase() {
  const origStore = new Storage({
    name: 'originalDB', // the original database name
    driverOrder: [CordovaSQLiteDriver._driver, Drivers.IndexedDB, Drivers.LocalStorage]
  });
  await origStore.defineDriver(CordovaSQLiteDriver);

  const newStore = new Storage({
    name: 'encryptedDB', // pick a new db name for the encrypted db
    driverOrder: [Drivers.SecureStorage, Drivers.IndexedDB, Drivers.LocalStorage]
  });
  await newStore.defineDriver(IonicSecureStorageDriver);
  newStore.setEncryptionKey('mykey');

  if (await origStore.length() > 0) {
    // copy existing data into new, encrypted format
    await origStore.forEach((key, value, index) => {
      newStore.set(key, value);
    });

    // remove old data
    await origStore.clear();
  }

  this._storage = newStore;
}

More Repositories

1

ionic-framework

A powerful cross-platform UI toolkit for building native-quality iOS, Android, and Progressive Web Apps with HTML, CSS, and JavaScript.
TypeScript
49,820
star
2

ionicons

Premium hand-crafted icons built by Ionic, for Ionic apps and web apps everywhere 🌎
TypeScript
17,166
star
3

stencil

A toolchain for building scalable, enterprise-ready component systems on top of TypeScript and Web Component standards. Stencil components can be distributed natively to React, Angular, Vue, and traditional web developers from a single, framework-agnostic codebase.
TypeScript
11,913
star
4

capacitor

Build cross-platform Native Progressive Web Apps for iOS, Android, and the Web ⚡️
TypeScript
10,748
star
5

ionic-conference-app

A conference app built with Ionic to demonstrate Ionic
TypeScript
3,543
star
6

ng-cordova

OBSOLETE: Please move to Ionic Native https://github.com/ionic-team/ionic-native
JavaScript
3,499
star
7

ionic-cli

The Ionic command-line interface
TypeScript
1,991
star
8

ionic-angular-cordova-seed

The perfect starting point for an Ionic project
JavaScript
726
star
9

ionic-pwa-toolkit

Build lightning fast Progressive Web Apps with zero config and best practices built-in. Go from zero to production ready with Ionic and Stencil (Web Components).
TypeScript
634
star
10

ionic-plugin-keyboard

Ionic Keyboard Plugin for Cordova
C++
613
star
11

ionic-app-scripts

App Build Scripts for Ionic Projects
TypeScript
612
star
12

ionic-docs

HTML
564
star
13

ionic-react-conference-app

The Ionic Conference Demo App - Now in React
TypeScript
486
star
14

cordova-plugin-ionic-webview

Web View plugin for Cordova, specialized for Ionic apps.
Objective-C
482
star
15

capacitor-plugins

Official plugins for Capacitor ⚡️
Java
462
star
16

ionic-site

Repo for the ionicframework.com site
JavaScript
453
star
17

capacitor-assets

Local Capacitor icon/splash screen resource generation tool
TypeScript
448
star
18

starters

Starter templates for Ionic apps, used by the Ionic CLI
JavaScript
446
star
19

ionic-app-base

A base starting point for Ionic, with Cordova, Bower, and Gulp.
JavaScript
424
star
20

ionic-ion-tinder-cards

Add Tinder-style card swiping to any app with this simple Ionic Ion.
JavaScript
390
star
21

ionic-starter-super

The Ionic 2 Super Starter 🎮
TypeScript
382
star
22

ionic-unit-testing-example

Example of adding unit testing in your Ionic 2.x or greater apps with Karma and Jasmine
TypeScript
378
star
23

ionic-ion-swipe-cards

Swipeable card based layout for Ionic and Angular
JavaScript
354
star
24

ionic-plugin-deeplinks

Handle deeplinks into your Ionic/Cordova apps from Universal Links, App Links, and Custom URL schemes. For those using Ionic 2, there are some nice goodies that make life easier.
Objective-C
332
star
25

stencil-site

Stencil site and documentation source.
TypeScript
318
star
26

graphite

Clean jQuery Mobile theme-pack and theme generator
JavaScript
302
star
27

stencil-component-starter

Minimal starter project for building shareable web components with Stencil https://github.com/ionic-team/stencil
TypeScript
263
star
28

ionic2-starter-aws

Ionic + AWS MobileHub Starter Project
JavaScript
238
star
29

collide

A powerful javascript animation engine for web and hybrid mobile apps, inspired by Facebook Pop, built by the Ionic team.
JavaScript
234
star
30

ionic-native-google-maps

Google maps plugin for Ionic Native
TypeScript
223
star
31

ionic2-app-base

Template for starting Ionic 2 apps, used by the Ionic CLI
CSS
222
star
32

stencil-ds-output-targets

These are output targets that can be added to Stencil for React and Angular.
TypeScript
219
star
33

front-page

An example Hacker News app showcasing what's possible with Ionic
JavaScript
198
star
34

trapeze

The mobile project configuration toolbox. Manage native iOS, Android, Ionic/Capacitor, React Native, and Flutter apps through a simple YAML format.
TypeScript
194
star
35

ionic-v1

The repo for Ionic 1.x. For the latest version of Ionic, please see https://github.com/ionic-team/ionic
JavaScript
192
star
36

ionic-starter-tabs

A starting project for Ionic using a simple tabbed interface
HTML
161
star
37

ionic-ion-header-shrink

A demo of making a header that shrinks based on the user scrolling (like Facebook's iOS app).
JavaScript
161
star
38

creator-weekly-workshops

Here you can find any code that we use in the Creator Demo Videos
JavaScript
154
star
39

ionifits

Human Resources demo app (Zenefits clone) serving as a reference for enterprise app developers on the Ionic stack.
TypeScript
150
star
40

ionic-example-cordova-camera

An example of how to use the Cordova Camera API
JavaScript
150
star
41

stencil-store

Store is a lightweight shared state library by the StencilJS core team. Implements a simple key/value map that efficiently re-renders components when necessary.
TypeScript
149
star
42

ionic-starter-maps

An Ionic starter project using Google Maps and a side menu
JavaScript
143
star
43

tutorial-photo-gallery-angular

Photo Gallery Tutorial: Ionic Angular and Capacitor
TypeScript
139
star
44

pwa-elements

Quality UI experiences for Web APIs that require custom UI (such as media/camera).
TypeScript
135
star
45

ionic-v3

The repo for Ionic 3.x. For the latest version of Ionic, please see https://github.com/ionic-team/ionic
TypeScript
129
star
46

ionic-starter-sidemenu

A starting project for Ionic using a side menu with navigation in the content area
JavaScript
126
star
47

ionic-contrib-frosted-glass

An optional frosted-glass effect for iOS 7 styled Ionic apps.
JavaScript
123
star
48

ionic-heroku-button

A one-click Ionic app template for Heroku
JavaScript
123
star
49

native-run

Utility for running native binaries on iOS and Android devices and simulators/emulators
TypeScript
115
star
50

ionic-starter-cardboard

A google cardboard template for Ionic
JavaScript
113
star
51

ionic-pwa-demos

A collection of cool Ionic Progressive Web App demos. PR to add your own!
JavaScript
109
star
52

rollup-plugin-node-polyfills

JavaScript
108
star
53

ionic-vue-conference-app

Ionic Conference app ported to Vue
Vue
104
star
54

ionic-stencil-hn-app

Ionic Stencil HackerNews App
TypeScript
103
star
55

ionic-module-template

A template for building a reusable Angular 2 module for Ionic 2 apps
TypeScript
96
star
56

stencil-state-tunnel

A tool for tunneling state/props down through a component stack.
TypeScript
95
star
57

stencil-redux

TypeScript
95
star
58

ionic-bower

Bower repository for Ionic
JavaScript
93
star
59

ionic-present

Present Ionic in your town. Share the new way to build mobile apps.
JavaScript
90
star
60

ionic-stencil-conference-app

A conference app built with Stencil to demonstrate Ionic
TypeScript
90
star
61

capacitor-remix-templates

Build native iOS, Android, and Web apps with Capacitor and Remix.run 💿
Swift
90
star
62

ionic2-starter-tutorial

This tutorial goes along with the example on Ionic v2 documentation
TypeScript
87
star
63

ionic-starter-salesforce

A starter project for Ionic and Salesforce
JavaScript
85
star
64

cordova-plugin-ionic

Ionic Cordova SDK
TypeScript
78
star
65

ionic-proxy-example

A quick Ionic project showing how to use the proxy server
JavaScript
75
star
66

docs-demo

A demo/kitchen sink for the docs
TypeScript
74
star
67

ionic-contrib-firebase-login

Using Firebase's angularFire and simple login with Ionic
JavaScript
69
star
68

ionic-package-hooks

Cordova hooks that you can run in Ionic Package
JavaScript
69
star
69

stencil-sass

Sass plugin for Stencil
TypeScript
69
star
70

angular-toolkit

Angular Schematics and Builders for `@ionic/angular` apps.
TypeScript
68
star
71

ionic2-starter

An Ionic2 starter project
68
star
72

tutorial-photo-gallery-react

Photo Gallery Tutorial: Ionic React and Capacitor
TypeScript
68
star
73

legacy-ionic-cloud

JavaScript Client for legacy Ionic Cloud services. See Ionic Pro for our new take on the ionic development lifecycle
TypeScript
65
star
74

photo-gallery-tutorial-ionic4

Ionic framework v4 tutorial: Building a Photo Gallery!
TypeScript
64
star
75

ionic-learn

CSS
62
star
76

ionic-ion-frost

A reusable frosted-glass effect for adding this cool iOS effect to your Ionic apps.
JavaScript
62
star
77

create-capacitor-plugin

Create a new Capacitor plugin ⚡️
Mustache
58
star
78

tutorial-photo-gallery-vue

Photo Gallery Tutorial: Ionic Vue and Capacitor
CSS
57
star
79

ionic2-starter-tabs

A starting project for Ionic using a simple tabbed interface
TypeScript
53
star
80

ionic-ion-drawer

A side menu drawer for Ionic apps
JavaScript
51
star
81

tslint-ionic-rules

Common TypeScript lint rules/preferences for Ionic.
TypeScript
50
star
82

ionic-portals

Portals Javascript Library and Docs
JavaScript
50
star
83

stencil-router-v2

TypeScript
45
star
84

ionic-app-lib

The library used for using ionic apps - consumed by the CLI and the GUI
JavaScript
44
star
85

capacitor-starters

A collection of projects to use as a resource for new Capacitor apps
JavaScript
44
star
86

stencil-ds-plugins-demo

This is a demo project using the stencil-ds-plugins.
TypeScript
44
star
87

create-stencil

npm init stencil
TypeScript
43
star
88

ionic-gulp-tasks

Collection of gulp tasks for building Ionic apps
JavaScript
41
star
89

ionic2-starter-sidemenu

A starting project for Ionic with side menu navigation
TypeScript
41
star
90

ionic-code

Ionic code
JavaScript
40
star
91

stencil-ds-react-template

This is an example repo of building plugins.
TypeScript
37
star
92

appflow-build

GitHub Action for triggering Appflow Builds
TypeScript
36
star
93

stencil-inspector

TypeScript
36
star
94

ionic2-deeplinks-demo

A test repo for deep linking in Ionic 2
JavaScript
35
star
95

ionic-ion-ios-buttons

Simple iOS 7 style rounded buttons with CSS
34
star
96

portals-ecommerce-demo

E-commerce Demo App using Ionic Portals
Java
33
star
97

ionic-e2e-example

Example app for Ionic E2E
TypeScript
32
star
98

capacitor-testapp

TypeScript
32
star
99

eas-2021

Conference app for the Ionic Enterprise App Summit 2021.
TypeScript
30
star
100

ionic-cloud-angular

Angular 2 Integration for Ionic Cloud
TypeScript
29
star