Table of Contents

    SQLite3 Native Plugin for React Native for both Android (Classic and Native), iOS.
    Foundation of this library is based on Chris Brody's Cordova SQLite plugin.

    Characteristic:

    • SQL transactions
    • Android in pure Java and Native modes
    • iOS and Android supported via identical JavaScript API.
    • Pre-populated SQLite database import from application bundle and sandbox
    • JavaScript interface via plain callbacks or Promises.

    There are sample apps provided in the test directory that can be used in with the AwesomeProject generated by React Native. All you have to do is to copy one of those files into your AwesomeProject replacing index.ios.js.
    The library has been tested with React 16.2 (and earlier) and XCode 7,8,9 - it works fine out of the box without any need for tweaks or code changes. For XCode 7,8 vs. XCode 6 the only difference is that sqlite ios library name suffix is tbd instead of dylib.
    Version 3.2 is the first version compatible with RN 0.40.


    How to use (iOS):
    Step 1 - Install Dependencies
    With CocoaPods:
    This command should be executed in the root directory of your project

    npm install --save react-native-sqlite-storage

    Then add this to your Podfile which should be located inside the ios project subdirectory

    pod 'React', :path => '../node_modules/react-native'
    pod 'react-native-sqlite-storage', :path => '../node_modules/react-native-sqlite-storage'

    Or use the sample Podfile included in the package by copying it over to iOS subdirectory and replacing AwesomeProject inside of it with the name of your project.

    Refresh the Pods installation

    pod install

    OR

    pod update

    Done, skip to Step 2

    Without CocoaPods:
    This command should be executed in the root directory of your project

    npm install --save react-native-sqlite-storage
    react-native link

    rnpm and xcode are dependencies of this project and should get installed with the module but in case there are issue running rnpm link and rnpm/xcode are not already installed you can try to install it globally as follows:

    npm -g install rnpm xcode

    After linking project should like this:

    Step 1 - If rnpm link does not work for you then you can try manually linking according to the instructions below: Drag the SQLite Xcode project as a dependency project into your React Native XCode project

    XCode SQLite libraries dependency set up

    Add libSQLite.a (from Workspace location) to the required Libraries and Frameworks. Also, add sqlite3.0.tbd (XCode 7) or libsqlite3.0.dylib (XCode 6 and earlier) in the same fashion using Required Libraries view (Do not just add them manually as the build paths will not be properly set)

    Step 2 - Application JavaScript require
    Add var SQLite = require('react-native-sqlite-storage') to your index.ios.js

    var React = require('react-native');
    var SQLite = require('react-native-sqlite-storage');

    Step 3 - Write application JavaScript code using the SQLite plugin

    Add JS application code to use SQLite API in your index.ios.js etc. Here is some sample code. For a full working example see test/index.ios.callback.js. Please note that Promise based API is now supported as well with full examples in the working React Native app under test/index.ios.promise.js

    errorCB(err) {
    console.log("SQL Error: " + err);
    },

    successCB() {
    console.log("SQL executed fine");
    },

    openCB() {
    console.log("Database OPENED");
    },

    var db = SQLite.openDatabase("test.db", "1.0", "Test Database", 200000, openCB, errorCB);
    db.transaction((tx) => {
    tx.executeSql('SELECT * FROM Employees a, Departments b WHERE a.department = b.department_id', [], (tx, results) => {
    console.log("Query completed");

    // Get rows with Web SQL Database spec compliance.

    var len = results.rows.length;
    for (let i = 0; i < len; i++) {
    let row = results.rows.item(i);
    console.log(`Employee name: ${row.name}, Dept Name: ${row.deptName}`);
    }

    // Alternatively, you can use the non-standard raw method.

    /*
    let rows = results.rows.raw(); // shallow copy of rows Array

    rows.map(row => console.log(`Employee name: ${row.name}, Dept Name: ${row.deptName}`));
    */
    });
    });
    How to use (Android):
    Step 1 - NPM Install

    npm install --save react-native-sqlite-storage


    Step 2 - Update Gradle Settings (located under Gradle Settings in Project Panel)

    // file: android/settings.gradle
    ...

    include ':react-native-sqlite-storage'
    project(':react-native-sqlite-storage').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sqlite-storage/src/android')

    Step 3 - Update app module Gradle Build script (located under Gradle Settings in Project Panel)

    // file: android/app/build.gradle
    ...

    dependencies {
    ...
    implementation project(':react-native-sqlite-storage')
    }

    Step 4 - Register React Package (this should work on React version but if it does not, try the ReactActivity based approach. Note: for version 3.0.0 and below you would have to pass in the instance of your Activity to the SQLitePluginPackage constructor

    ...
    import org.pgsqlite.SQLitePluginPackage;

    public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {

    private ReactInstanceManager mReactInstanceManager;
    private ReactRootView mReactRootView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mReactRootView = new ReactRootView(this);
    mReactInstanceManager = ReactInstanceManager.builder()
    .setApplication(getApplication())
    .setBundleAssetName("index.android.bundle") // this is dependant on how you name you JS files, example assumes index.android.js
    .setJSMainModuleName("index.android") // this is dependant on how you name you JS files, example assumes index.android.js
    .addPackage(new MainReactPackage())
    .addPackage(new SQLitePluginPackage()) // register SQLite Plugin here
    .setUseDeveloperSupport(BuildConfig.DEBUG)
    .setInitialLifecycleState(LifecycleState.RESUMED)
    .build();
    mReactRootView.startReactApplication(mReactInstanceManager, "AwesomeProject", null); //change "AwesomeProject" to name of your app
    setContentView(mReactRootView);
    }
    ...

    Alternative approach on newer versions of React Native (0.18+). Note: for version 3.0.0 and below you would have to pass in the instance of your Activity to the SQLitePluginPackage constructor
    import org.pgsqlite.SQLitePluginPackage;

    public class MainApplication extends Application implements ReactApplication {
    ......

    /**
    * A list of packages used by the app. If the app uses additional views
    * or modules besides the default ones, add more packages here.
    */
    @Override
    protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
    new SQLitePluginPackage(), // register SQLite Plugin here
    new MainReactPackage());
    }
    }

    Step 5 - Require and use in Javascript - see full examples (callbacks and Promise) in test directory.

    // file: index.android.js

    var React = require('react-native');
    var SQLite = require('react-native-sqlite-storage')
    ...

    Setting up your project to import a pre-populated SQLite database from an application for iOS

    Step 1 - Create 'www' folder.

    Create a folder called 'www' (yes must be called precisely what else things won't work) in the project folder via Finder

    Step 2 - Create the database file

    Copy/paste your pre-populated database file into the 'www' folder. Give it the same name you are going to use in openDatabase call in your application

    Step 3 - Add file to project

    in XCode, right click on the main folder and select Add Files to 'your project name'

    Step 4 - Choose files to add

    In the Add Files dialog, navigate to the 'www' directory you created in Step 1, select it, make sure you check the option to Create Folder Reference

    Step 5 - Verify project structure

    Ensure your project structure after previous steps are executed looks like this

    Step 6 - Adjust openDatabase call

    Modify your openDatabase call in your application adding createFromLocation param. If you named your database file in step 2 'testDB' the openDatabase call should look like something like this:

    ...
    1.SQLite.openDatabase({name : "testDB", createFromLocation : 1}, okCallback,errorCallback);
    // default - if your folder is called www and data file is named the same as the dbName - testDB in this example
    2.SQLite.openDatabase({name : "testDB", createFromLocation : "~data/mydbfile.sqlite"}, okCallback,errorCallback);
    // if your folder is called data rather than www or your filename does not match the name of the db
    3.SQLite.openDatabase({name : "testDB", createFromLocation : "/data/mydbfile.sqlite"}, okCallback,errorCallback);
    // if your folder is not in app bundle but in app sandbox i.e. downloaded from some remote location.
    ...

    For Android, the www directory is always relative to the assets directory for the app: src/main/assets

    About Author

    Manektech Team

    Nikhil Solanki

    Mobile Lead

    Nikhil Solanki has 10+ years of experience in Mobile App Development and currently works as the Mobile Lead at ManekTechworked. He is an experienced Mobile lead with a demonstrated history of working in Mobile's information technology and services industry. 

    Subscribe to Our Newsletter!

    Join us to stay updated with our latest blog updates, marketing tips, service tips, trends, news and announcements!

    OUR OFFICES


    ManekTech's Global Presence

    USA

    4100 NW Loop 410, Suite 200, San Antonio, Texas, USA 78229

    UK

    7 Artisan Place Harrow, HA3 5DS

    India

    4th Floor, Timber Point, Prahaladnagar Road, Ahmedabad, Gujarat - 380015

    Germany

    Franz-Joseph-Strasse, 11,Munich, 80801, Germany

    South Africa

    The Business Centre No 1. Bridgeway Road, Bridgeway Precint, Century City, Cape Town, South Africa, 7446

    PREV
    NEXT