Flutterアプリケーション開発に、NoSQLドキュメント指向組み込みデータベースCouchbase Liteを使うには？


## はじめに


本稿では、Couchbase LiteをFlutterアプリケーションで開発する際に、現在利用できる情報を紹介します。

結論から言うと、現時点でFlutterアプリケーション開発にCouchbase Liteを利用するのは、一筋縄ではいかない、と言えます。これは、（技術ブログの読者層を前提として言えば）コミュニティに貢献することができる余地がある状況とも言えるでしょう。

## Couchbase Liteとは

Couchbase Liteは、iOS、Android、.Netプラットフォーム用の組み込みNoSQLデータベースです。Android（Java）、iOS（Swift、Objective-C）、およびUWP/Xamarin（C#）のネイティブプラットフォームバインディングをサポートしています。

モバイルクロスプラットフォームフレームワークについては、Xamarin、React Native、そしてCordovaに関する公式チュートリアルが発表されています。

## Flutterサポート要望の高まり

Couchbaseに関するディスカッションフォーラムの下記のスレッドでFlutter SDKの必要性について議論されています。

https://forums.couchbase.com/t/couchbase-lite-sdk-for-flutter/28466

## Flutterパッケージ

Flutter開発者にとっては、Dart/Flutterの公式パッケージリポジトリで、各種パッケージが公開されていることはお馴染みでしょう。

https://pub.dev/

Couchbaseについても、上記のようなニーズの高まりを反映して、パッケージが登録されています。

### couchbase_liteプラグイン

https://pub.dev/packages/couchbase_lite


couchbase_liteプラグインは、Couchbase Lite Community Edition用のFlutterプラグインです。このプロジェクトはFluttercouchからフォークされ、Couchbase Liteとは以下の依存関係を持ちます(Couchbase Liteの2021年12月現在の最新バージョンは、2.8)。

```
dependencies:
  couchbase_lite: ^2.7.1
  
  flutter:
      sdk: flutter
```


このプロジェクトの目標は、Couchbase Lite Swift SDK APIに準拠する機能を提供することとされていますが、現時点では開発中であり、フィードバック/プルリクエストが歓迎されています。

上記のURLには、パッケージ利用例（データベース関係部分を抜粋）が掲載されています。以下、コメントを日本語化して引用します。



```dart
// データベース初期化
try {
  database = await Database.initWithName("gettingStarted");
} on PlatformException {
  return "Error initializing database";
}

// 新規ドキュメント作成
var mutableDoc = MutableDocument()
    .setDouble("version", 2.0)
    .setString("type", "SDK");

// ドキュメントをデータベースへ保存
try{
  await database.saveDocument(mutableDoc);
} on PlatformException {
  return "Error saving document";
}

// ドキュメントの更新
mutableDoc = (await database.document(mutableDoc.id))?.toMutable()?.setString("language", "Dart");

if (mutableDoc != null) {
  // Save it to the database.
  try {
    await database.saveDocument(mutableDoc);

    var document = await database.document(mutableDoc.id);

    // ドキュメントID（データベースによって生成）とドキュメントのプロパティをログ出力
    print("Document ID :: ${document.id}");
    print("Learning ${document.getString("language")}");
  } on PlatformException {
    return "Error saving document";
  }
}

// データベースへのクエリ作成（typeプロパティが「SDK」の値を持つドキュメントを抽出）
var query = QueryBuilder
    .select([SelectResult.all().from("mydocs")])
    .from("gettingStarted", as: "mydocs")
    .where(Expression.property("type").from("mydocs").equalTo(Expression.string("SDK")));

// クエリ実行
try {
  var result = await query.execute();
  print("Number of rows :: ${result.allResults().length}");
} on PlatformException {
  return "Error running the query";
}

// Note wss://10.0.2.2:4984/my-database is for the android simulator on your local machine's couchbase database
// Couchbase Serverとの同期(プッシュアンドプルモード)を行うレプリケーター設定を作成
// 注：ここで、「10.0.2.2」は、AndroidシミュレーターにおけるローカルマシンのIP
ReplicatorConfiguration config =
ReplicatorConfiguration(database, "ws://10.0.2.2:4984/beer-sample");
config.replicatorType = ReplicatorType.pushAndPull;
config.continuous = true;

// 認証を追加
config.authenticator = BasicAuthenticator("foo", "bar");

// レプリケーター生成
var replicator = Replicator(config);

// レプリケーターにデータベースの変更イベントを受け取るリスナーを追加
_listenerToken = replicator.addChangeListener((ReplicatorChange event) {
  if (event.status.error != null) {
    print("Error: " + event.status.error);
  }

  print(event.status.activity.toString());
});
```

抜粋ではない、コード全体は、以下で確認できます。
https://pub.dev/packages/couchbase_lite/example

このプログラムでは、「BLoC(Business Logic Component)パターン(Flutterでのアプリケーション開発時に用いられる、状態管理のためのデザインパターン)を使用している（ビュー<-> BLoC <->リポジトリ<->データベース）」とされています。

## FFI(foreign function interface)による連携

Flutterには、プラットフォームとのインテグレーションに用いることができる、dart:ffiパッケージが存在します。

https://docs.flutter.dev/development/platform-integration/c-interop

FFI(foreign function interface)については、下記参照。

https://en.wikipedia.org/wiki/Foreign_function_interface

Couchbase Liteは、C APIが公開されており、上述のコミュニティ
で開発中のパッケージに依存しない場合は（あるいは、それに貢献したい場合）、これらの組み合わせを用いることになるでしょう。

https://github.com/couchbase/couchbase-lite-C

## 最後に

本稿の記事は、Flutterアプリケーション開発に、Couchbase Liteを使うためのきっかけとはなりにくいとは思いますが、このテーマに何らか関心のある方に対して、情報を提供できていれば幸いです。

最後に、Couchbaseについて何らかの関心を持っていただけたFlutter開発者の方々へ向けて、Couchbaseについての情報ソースを紹介し、締めくくりとしたいと思います。

Couchbase Liteをアプリケーション開発に利用する意義については、以下の記事をご参考ください。

https://qiita.com/yoshiyuki_kono/items/3abd5e32801060a449d2

Couchbase Liteについての記事を以下の投稿で整理していますので、ご関心に応じて、参照してみてください。

https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417

上掲のコード例にもあるように、Couchbase Liteをアプリケーションで用いる動機のひとつとして、Couchbase Serverとの自動双方向同期機能があります。Couchbase Serverについては、日本語で読むことができるまとまった情報として、次の拙著を紹介させていただきます。

https://www.amazon.co.jp/-/en/%E6%B2%B3%E9%87%8E-%E6%B3%B0%E5%B9%B8/dp/429560030X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1636588872&sr=1-1



## 関連情報

https://pub.dev/packages/couchbase_lite

https://github.com/SaltechSystems/couchbase_lite

https://pub.dev/documentation/couchbase_lite/latest/


https://blog.couchbase.com/fluttercouch-flutter-and-couchbase/

https://github.com/fluttercouch/fluttercouch