Announcing react-native-sqlite-2@3.0.1!
Tags: reactnative, react, sqlite, database
Published: 2019-10-23 07:32:12

Hi, it's [Takuya](https://twitter.com/inkdrop_app).

I'm building my own app called [Inkdrop](https://inkdrop.app/) with React Native.
I needed a WebSQL-compatible library for my app to use [PouchDB](https://dev.to/craftzdog/hacking-pouchdb-to-use-on-react-native-1gjh), so I made [react-native-sqlite-2](https://github.com/craftzdog/react-native-sqlite-2).

## Why?

There is an exact library to use SQLite on RN apps, which is [react-native-sqlite-storage](https://github.com/andpor/react-native-sqlite-storage).
But it has some advantages over it:

- It [can't store string data with `\u0000`](https://github.com/andpor/react-native-sqlite-storage/issues/107) due to [the react native problem](https://github.com/facebook/react-native/issues/12731).
  - 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](https://github.com/pouchdb/pouchdb/issues/6037).

This plugin solves these problems.

## What's new in 3.x

It has a big improvement for Android!

### Newer SQLite3 on Android

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](https://github.com/requery/sqlite-android) which allows you to use the latest version of it with new SQLite features enabled:

- [JSON1 extension](https://www.sqlite.org/json1.html)
- [Common Table expressions](https://www.sqlite.org/lang_with.html)
- [Indexes on expressions](https://www.sqlite.org/expridx.html)
- [FTS5 extension](https://sqlite.org/fts5.html)

## Getting started

Add react-native-sqlite-2 to your dependencies:

```shell
$ npm install react-native-sqlite-2 --save
```

### Link native dependencies

From react-native 0.60 autolinking will take care of the link step but don't forget to run `pod install`.

```shell
$ react-native link react-native-sqlite-2
```

#### iOS

If using cocoapods in the `ios/` directory run

```shell
$ pod install
```

#### Android

Please make sure AndroidX is enabled in your project by editting `android/gradle.properties` and adding 2 lines:

```
android.useAndroidX=true
android.enableJetifier=true
```

## Usage

```javascript
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](https://github.com/craftzdog/react-native-sqlite-2/tree/master/test).

### Using with PouchDB

It can be used with [pouchdb-adapter-react-native-sqlite](https://github.com/craftzdog/pouchdb-adapter-react-native-sqlite).

```javascript
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" });
```

## Further informations

* GitHub repos: https://github.com/craftzdog/react-native-sqlite-2
* Inkdrop - Markdown note-taking app: https://inkdrop.app/
* Twitter: https://twitter.com/inkdrop_app