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

## はじめに

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

関連して、先日下記の投稿を行いました。

https://qiita.com/yoshiyuki_kono/items/d253caba38a9b12ba8f3

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

## Couchbase Liteとは

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

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

## パッケージ

### cbl_dart

https://pub.dev/packages/cbl_dart

サーバーやCLIなどの純粋なDartアプリケーション用のCouchbase Liteパッケージとして公開されています。このパッケージは現在ベータ版とされています。

### cbl

https://pub.dev/packages/cbl

cbl_dartと同じPublisherによるCouchbase Lite APIのパッケージです。

cbl_dartを利用する場合、同時に依存関係に加えます。

また、同じPublisherによるcbl_flutterというパッケージも存在し、このcblパッケージと同時に使うことでFlutterアプリケーション開発に用いることができます。

https://pub.dev/packages/cbl_flutter

これは、下記のcouchbase_liteパッケージがそれ自体で完結しているのと異なる特徴です。

https://pub.dev/packages/couchbase_lite


## cbl_dart入門

cbl_dartを使い始める方法を紹介します。

### インストール方法


次のコマンドを実行します。

```
 $ dart pub add cbl_dart
```

これにより、pubspec.yamlに次のような行が追加されます（`dart pub get`が暗黙的に実行されます）。

```
dependencies:
  cbl_dart: ^1.0.0-beta.3
```


Dartコードで、以下のようにインポートします。

```
import 'package:cbl_dart/cbl_dart.dart';
```




### コーディング例

Exampleセクションに掲載されている、サンプルアプリケーションコードを紹介します。
「Usage」に書かれているように、パラメーターとして与えたメッセージをデータベースに保存し、パラメーターがない場合は、保存されているメッセージを表示する、という簡易な機能を通じて、パッケージの使い方が紹介されています。

```dart:example/lib/main.dart
// ignore_for_file: avoid_print

import 'dart:io';

import 'package:cbl/cbl.dart';
import 'package:cbl_dart/cbl_dart.dart';

late final Database db;

Future<void> main(List<String> args) async {
  if (args.contains('--help') ||
      args.contains('-h') ||
      (args.isNotEmpty && args.length != 1)) {
    print(
      '''
Usage: dart lib/main.dart [message]

The provided message will be stored in the database.

If no message is provided, all stored messages will be listed.
''',
    );
    exit(1);
  }

  await CouchbaseLiteDart.init(edition: Edition.community);

  db = await Database.openAsync('messages');

  final message = args.isEmpty ? null : args[0];

  if (message != null) {
    await storeMessage(message);
  } else {
    await listMessages();
  }

  await db.close();
}

Future<void> storeMessage(String message) async {
  final doc = MutableDocument({
    'type': 'message',
    'createdAt': DateTime.now(),
    'body': message,
  });

  await db.saveDocument(doc);

  print('Message ${doc.id} stored: ${doc.toJson()}');
}

Future<void> listMessages() async {
  final query = const QueryBuilder()
      .select(
        SelectResult.expression(Meta.id),
        SelectResult.property('createdAt'),
        SelectResult.property('body'),
      )
      .from(DataSource.database(db))
      .where(Expression.property('type').equalTo(
        Expression.string('message'),
      ))
      .orderBy(Ordering.property('createdAt').descending());

  final resultSet = await query.execute();
  var messages = 0;

  await for (final result in resultSet.asStream()) {
    messages++;
    print(result.toJson());
  }

  print('$messages messages found');
}
```



## 最後に

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

最後に、Couchbaseについて何らかの関心を持っていただけたDart開発者の方々へ向けて、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://kabochapo.hateblo.jp/entry/2020/02/01/144411

https://qiita.com/teradonburi/items/913fb8c311b9f2bdb1dd