react-native-sqlite-2@3.0.1 リリースしました

原文： [Announcing react-native-sqlite-2@3.0.1! - DEV Community 👩‍💻👨‍💻](https://dev.to/craftzdog/announcing-react-native-sqlite-2-3-0-1-36h7)

[Inkdrop](https://inkdrop.app/)というアプリをReact Nativeで作っていて、[PouchDB](https://dev.to/craftzdog/hacking-pouchdb-to-use-on-react-native-1gjh)を動かすためにWebSQL互換のライブラリが必要だったので[react-native-sqlite-2](https://github.com/craftzdog/react-native-sqlite-2)を作りました。

## なんで？

すでに[react-native-sqlite-storage](https://github.com/andpor/react-native-sqlite-storage)というSQLiteを扱うためのライブラリが存在しますが、拙作の方には少しアドバンテージがあります：

- [React Native側](https://github.com/facebook/react-native/issues/12731)の問題により、[`\u0000`混じりの文字列が格納できない](https://github.com/andpor/react-native-sqlite-storage/issues/107).
  - PouchDBがインデックス構築時にドキュメントIDにNull文字を多用するので、この問題の解決は重要です。
- PouchDBで添付ファイルを格納する動作が不安定: [#6037](https://github.com/pouchdb/pouchdb/issues/6037).

本ライブラリはこれらの問題を解決します。

## What's new in 3.x

Androidにとって大きな改善点があります！

### より新しいSQLite3をAndroidで

最新のAndroid OSのバージョンであっても、標準で搭載されているSQLiteのバージョンはいくつか古いものです。
iOSの方が新しいものが使えるのに。
React Native SQLite 2はこのアップデートによって[sqlite-android](https://github.com/requery/sqlite-android)を使うようになり、SQLiteの新機能が使えるようになりました：

- [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)

これでiOSでは出来たのにAndroidでは実装できないという悩みが減ります。
自分はFTS5が使いたかった。これはビルドフラグが単純に付いてないだけだったけど。

以降は使い方です。

## 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/craftzdog