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 solves these problems.
Even the latest version of Android is several versions behind the latest version of SQLite, whereas iOS has newer version. React Native SQLite 2 uses sqlite-android which allows you to use the latest version of it with new SQLite features enabled:
Add react-native-sqlite-2 to your dependencies:
$ npm install react-native-sqlite-2 --save
From react-native 0.60 autolinking will take care of the link step but don't forget to run pod install
.
$ react-native link react-native-sqlite-2
If using cocoapods in the ios/
directory run
$ pod install
Please make sure AndroidX is enabled in your project by editting android/gradle.properties
and adding 2 lines:
android.useAndroidX=true
android.enableJetifier=true
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.
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" });
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).
See CHANGELOG.md
https://github.com/nolanlawson/cordova-plugin-sqlite-2
The issues and limitations for the actual SQLite can be found on this site.