React Native SQLite 2
SQLite3 Native Plugin for React Native for Android/iOS/Windows. This plugin provides a WebSQL-compatible API to store data in a react native app, by using a SQLite database on the native side.
Inspired by fantastic work done by Nolan Lawson. It should be a drop-in replacement for react-native-sqlite-storage. It works pretty well with PouchDB on React Native app.
The reason for this plugin is that react-native-sqlite-storage
has some problems when used with PouchDB:
- It can't store string data with
\u0000
due to the react native problem.- PouchDB heavily uses the Null character in the document IDs for building index, so it won't work well.
- It's unstable for storing PouchDB's attachments: #6037.
This plugin avoids these problems.
Used by
Getting started
$ npm install react-native-sqlite-2 --save
Mostly automatic installation
$ react-native link react-native-sqlite-2
iOS
In Xcode, add libsqlite3.tbd
to your project's Build Phases
➜ Link Binary With Libraries
.
Manual installation
iOS
- In XCode, in the project navigator, right click
Libraries
➜Add Files to [your project's name]
- Go to
node_modules
➜react-native-sqlite-2
and addRNSqlite2.xcodeproj
- In Xcode, in the project navigator, select your project. Add
libRNSqlite2.a
to your project'sBuild Phases
➜Link Binary With Libraries
- Run your project (
Cmd+R
)<
Android
- Open up
android/app/src/main/java/[...]/MainActivity.java
- Add
import dog.craftz.sqlite_2.RNSqlite2Package;
to the imports at the top of the file - Add
new RNSqlite2Package()
to the list returned by thegetPackages()
method
- Append the following lines to
android/settings.gradle
:include ':react-native-sqlite-2' project(':react-native-sqlite-2').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sqlite-2/android')
- Insert the following lines inside the dependencies block in
android/app/build.gradle
:compile project(':react-native-sqlite-2')
Windows
- Open the solution in
Visual Studio
for your Windows apps.
-
Right click your solution file in the Explorer and click
Add
>Existing Project...
. -
[UWP] Navigate to
./<app-name>/windows/RNSqlite2/
and addRNSqlite2.csproj
.[WPF] Navigate to
./<app-name>/windows/RNSqlite2.Net46/
and addRNSqlite2.Net46.csproj
. -
Right click on your React Native Windows app under your solutions directory and click
Add
>Reference...
. -
[UWP] Check the
RNSqlite2
you just added and pressOk
.[WPF] Check the
RNSqlite2.Net46
you just added and pressOk
.
- Open
MainPage.cs
in your app
- Edit it like below:
using RNSqlite2;
get
{
return new List<IReactPackage>
{
new MainReactPackage(),
new RNSqlite2Package(),
};
}
Usage
import SQLite from 'react-native-sqlite-2';
const db = SQLite.openDatabase('test.db', '1.0', '', 1);
db.transaction(function (txn) {
txn.executeSql('DROP TABLE IF EXISTS Users', []);
txn.executeSql('CREATE TABLE IF NOT EXISTS Users(user_id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(30))', []);
txn.executeSql('INSERT INTO Users (name) VALUES (:name)', ['nora']);
txn.executeSql('INSERT INTO Users (name) VALUES (:name)', ['takuya']);
txn.executeSql('SELECT * FROM `users`', [], function (tx, res) {
for (let i = 0; i < res.rows.length; ++i) {
console.log('item:', res.rows.item(i));
}
});
});
There is a test app in the test directory.
Using with PouchDB
It can be used with pouchdb-adapter-react-native-sqlite.
import PouchDB from 'pouchdb-react-native'
import SQLite from 'react-native-sqlite-2'
import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite'
const SQLiteAdapter = SQLiteAdapterFactory(SQLite)
PouchDB.plugin(SQLiteAdapter)
var db = new PouchDB('mydb', { adapter: 'react-native-sqlite' })
Troubleshooting
Row too big to fit into CursorWindow (Android)
You can set a limited windowSizeBytes
for CursorWindow
and try-catch the exception by adding following code to your MainApplication.onCreate
in MainApplication.java
:
try {
Field field = CursorWindow.class.getDeclaredField("sCursorWindowSize");
field.setAccessible(true);
field.set(null, 100 * 1024 * 1024); //the 100MB is the new size
} catch (Exception e) {
if (DEBUG_MODE) {
e.printStackTrace();
}
}
Note that it requires Android 9 (API level 28).
Original Cordova SQLite Bindings from Nolan Lawson
https://github.com/nolanlawson/cordova-plugin-sqlite-2
The issues and limitations for the actual SQLite can be found on this site.