I'm archiving and deprecating this library: it uses Native Modules, which involves lots of inefficient marshalling, and also makes proper binary key/value support impossible. I'd suggest adopting react-native-leveldb instead: it's a more correct and more efficient JSI implementation. Unfortunately, its interface is not abstract-leveldown
compatible. If anyone would like to take over this repo and turn it into a compatibility shim for react-native-leveldb, I'm happy to transfer ownership of this and/or the NPM module.
This library implements an abstract-leveldown
compatible interface to LevelDB for React Native. The implementation is a thin Native Module binding directly to the original C++ implementation of LevelDB.
The native bindings are implemented for iOS and Android. The iOS bindings will also run on macOS via Catalyst.
My thanks to Giacomo Randazzo (@RAN3000) for contributing the Android bindings to this package.
Install via yarn add react-native-leveldown
. Make sure to cd ios; pod install
to build the native module for iOS.
This module implements the interface defined in abstract-leveldown
, so you can either use it directly as documented there or somewhat more conveniently using the levelup
wrapper.
Typical usage:
import RNLeveldown from "react-native-leveldown";
import LevelUp from "levelup";
const db = LevelUp(new RNLeveldown("myDatabaseName"));
await db.put("hello", "world");
await db.get("hello") // # => "world"
await db.close();
Note that databases are stored in the app container's Documents directory on iOS and the app's persistent files directory on Android. In the future, the constructor API should probably be extended to add an option to store it instead in some semi-durable cache location, or an ephemeral temporary directory.
This library passes the abstract-leveldown
test suite. To run the tests:
# Setup:
cd testapp
yarn install
# To run the tests on iOS:
(cd ios; pod install)
yarn ios
# To run the tests on Android:
yarn android
If you're looking for an implementation with no native code, you may be interested in asyncstorage-down
, which implements abstract-leveldown
using React Native's built-in AsyncStorage
. Note that this approach will be much slower than native LevelDB bindings, particularly on iOS, where AsyncStorage
is basically a serialized JSON blob.