This RxStorage is based on SQLite and is made to work with Node.js, Electron, React Native, Cordova and Capacitor.
- Fast
- Small build size
- It is part of RxDB Premium
The SQlite RxStorage works on SQLite libraries that use SQLite in version 3.38.0
or higher, because it uses the SQLite JSON methods like JSON_EXTRACT
. If you get an error like [Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1])
, you might have a too old version of SQLite.
import {
createRxDatabase
} from 'rxdb';
import {
getRxStorageSQLite,
getSQLiteBasicsNode
} from 'rxdb-premium/plugins/storage-sqlite';
/**
* In Node.js, we get use the SQLite database
* from the 'sqlite' npm module.
* @link https://www.npmjs.com/package/sqlite3
*/
import sqlite3 from 'sqlite3';
const myRxDatabase = await createRxDatabase({
name: 'exampledb',
storage: getRxStorageSQLite({
/**
* Different runtimes have different interfaces to SQLite.
* For example in node.js we have a callback API,
* while in capacitor sqlite we have Promises.
* So we need a helper object that is capable of doing the basic
* sqlite operations.
*/
sqliteBasics: getSQLiteBasicsNode(sqlite3)
})
});
- Install the react-native-quick-sqlite npm module
- Import
getSQLiteBasicsQuickSQLite
from the SQLite plugin and use it to create a RxDatabase:
import {
createRxDatabase
} from 'rxdb';
import {
getRxStorageSQLite,
getSQLiteBasicsQuickSQLite
} from 'rxdb-premium/plugins/storage-sqlite';
import { open } from 'react-native-quick-sqlite';
// create database
const myRxDatabase = await createRxDatabase({
name: 'exampledb',
multiInstance: false, // <- Set multiInstance to false when using RxDB in React Native
storage: getRxStorageSQLite({
sqliteBasics: getSQLiteBasicsQuickSQLite(open)
})
});
If react-native-quick-sqlite
does not work for you, as alternative you can use the react-native-sqlite-2 library instead:
import {
getRxStorageSQLite,
getSQLiteBasicsWebSQL
} from 'rxdb-premium/plugins/storage-sqlite';
import SQLite from 'react-native-sqlite-2';
const storage = getRxStorageSQLite({
sqliteBasics: getSQLiteBasicsWebSQL(SQLite.openDatabase)
});
- Install the sqlite capacitor npm module
- Add the iOS database location to your capacitor config
{
"plugins": {
"CapacitorSQLite": {
"iosDatabaseLocation": "Library/CapacitorDatabase"
}
}
}
- Use the function
getSQLiteBasicsCapacitor
to get the capacitor sqlite wrapper.
import {
createRxDatabase
} from 'rxdb';
import {
getRxStorageSQLite,
getSQLiteBasicsCapacitor
} from 'rxdb-premium/plugins/storage-sqlite';
/**
* Import SQLite from the capacitor plugin.
*/
import {
CapacitorSQLite,
SQLiteConnection
} from '@capacitor-community/sqlite';
import { Capacitor } from '@capacitor/core';
const sqlite = new SQLiteConnection(CapacitorSQLite);
const myRxDatabase = await createRxDatabase({
name: 'exampledb',
storage: getRxStorageSQLite({
/**
* Different runtimes have different interfaces to SQLite.
* For example in node.js we have a callback API,
* while in capacitor sqlite we have Promises.
* So we need a helper object that is capable of doing the basic
* sqlite operations.
*/
sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor)
})
});
If you need to access the database connection for any reason you can use getDatabaseConnection
to do so:
import { getDatabaseConnection } from 'rxdb-premium/plugins/storage-sqlite'
It has the following signiture:
getDatabaseConnection(
sqliteBasics: SQLiteBasics<any>,
databaseName: string
): Promise<SQLiteDatabaseClass>;
-
Some JavaScript runtimes do not contain a
Buffer
API which is used by SQLite to store binary attachments data asBLOB
. You can setstoreAttachmentsAsBase64String: true
if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having aBuffer
. -
expo-sqlite cannot be used on android (but it works on iOS) because it uses an outdated SQLite version
-
To debug all SQL operations, you can pass a log function to
getRxStorageSQLite()
like this:
const storage = getRxStorageSQLite({
sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor),
// pass log function
log: console.log.bind(console)
});