Flutter嵌入式数据库插件couchbase_lite的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter嵌入式数据库插件couchbase_lite的使用

couchbase_lite plugin

Build Status
Coverage Status
pub package

一个用于Couchbase Lite社区版的Flutter插件。它是一个轻量级、无服务器的嵌入式数据库,在Android和iOS上支持实时同步和离线功能。

该项目的目标是使此库与Couchbase Lite的Swift SDK API对齐。

注意:此插件仍在开发中,部分API可能尚未可用。欢迎提供反馈拉取请求

此项目基于Fluttercouch分叉而来。


开始使用

在你的Flutter项目中添加依赖项:

dependencies:
  couchbase_lite: ^2.7.1
  
  flutter:
      sdk: flutter

有关Flutter入门的更多信息,请查看官方文档


支持的版本

iOS
平台 最低操作系统版本
iOS 10.0 (9.0 已弃用)
Android
平台 运行时架构 最低API级别
Android armeabi-v7a 22 (19 已弃用)
Android arm64-v8a 22 (21 已弃用)
Android x86 22 (19 已弃用)
Android x86_64 22

API 参考

注意:语法遵循Swift SDK,但这些是平台代码所使用的SDK。


本地服务器设置

下载并安装Couchbase Server / Sync Gateway社区版,访问以下链接:

设置beer-sample数据库(本地Couchbase Server):

  1. 添加beer-sample桶:设置 -> 示例桶
  2. 在Couchbase Server的安全性下创建sync_gateway用户
  3. 授予sync_gateway访问beer-sample的权限

启动Sync Gateway:

~/Downloads/couchbase-sync-gateway/bin/sync_gateway ~/path/to/sync-gateway-config.json

注意:此示例中包含sync-gateway-config.json(登录信息为u: foo, p: bar)。


使用示例

以下是一个使用BLoC模式(View ↔ BLoC ↔ Repository ↔ Database)的数据库示例:

// 初始化数据库
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) {
  // 将更新后的文档保存到数据库中。
  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";
  }
}

// 创建查询以获取类型为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";
}

// 注意wss://10.0.2.2:4984/my-database 是用于Android模拟器上的本地Couchbase数据库。
// 创建复制器以从云端推送和拉取更改。
ReplicatorConfiguration config =
ReplicatorConfiguration(database, "ws://10.0.2.2:4984/beer-sample");
config.replicatorType = ReplicatorType.pushAndPull;
config.continuous = true;

// 添加身份验证。
config.authenticator = BasicAuthenticator("foo", "bar");

// 创建复制器(确保添加一个名为replicator的实例或静态变量)。
var replicator = Replicator(config);

// 监听复制器更改事件。
_listenerToken = replicator.addChangeListener((ReplicatorChange event) {
  if (event.status.error != null) {
    print("Error: " + event.status.error);
  }

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

// 启动复制器。
await replicator.start();

注意:对于此入门指南,您需要允许使用ws协议。

从Android Pie(版本9,API 28)开始,默认禁用了明文流量支持。虽然wss协议不受影响,但在Android 27或更低版本中使用ws协议的应用程序必须配置网络安全性。例如:

<application android:usesCleartextTraffic="true">
</application>

自iOS 9起,默认启用App Transport Security,强制应用程序仅使用HTTPS。为了完成本入门指南,您需要禁用它,但在生产环境中我们建议启用它,并启用Sync Gateway上的HTTPS。在Xcode资源管理器中,右键单击Info.plist文件并以源文件形式打开它。

</dict>标签内追加以下内容:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key><true/>
</dict>

示例代码

以下是完整的示例代码,您可以将其直接运行:

import 'dart:async';

import 'package:couchbase_lite/couchbase_lite.dart';
import 'package:flutter/material.dart';

void main() => runApp(BeerSampleApp(AppMode.production));

class BeerSampleApp extends StatelessWidget {
  final AppMode mode;

  const BeerSampleApp(this.mode);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _status = 'Initializing...';
  Database _database;
  Replicator _replicator;
  ListenerToken _listenerToken;

  [@override](/user/override)
  void initState() {
    super.initState();
    _initialize();
  }

  Future<void> _initialize() async {
    try {
      _database = await Database.initWithName("gettingStarted");
      _status = 'Database initialized.';
    } catch (e) {
      _status = 'Error initializing database: $e';
      return;
    }

    // 创建新文档。
    var doc = MutableDocument()
        ..setDouble("version", 2.0)
        ..setString("type", "SDK");

    try {
      await _database.saveDocument(doc);
      _status += '\nDocument saved.';
    } catch (e) {
      _status += '\nError saving document: $e';
      return;
    }

    // 查询所有文档。
    var query = QueryBuilder.select([SelectResult.property("type")])
        .from("gettingStarted")
        .where(Expression.property("type").equalTo(Expression.string("SDK")));

    try {
      var result = await query.execute();
      _status += '\nQuery results: ${result.allResults().length} rows.';
    } catch (e) {
      _status += '\nError running query: $e';
      return;
    }

    // 设置复制器。
    var replicatorConfig = ReplicatorConfiguration(_database, "ws://10.0.2.2:4984/beer-sample");
    replicatorConfig.replicatorType = ReplicatorType.pushAndPull;
    replicatorConfig.continuous = true;
    replicatorConfig.authenticator = BasicAuthenticator("foo", "bar");

    try {
      _replicator = Replicator(replicatorConfig);
      _listenerToken = _replicator.addChangeListener((event) {
        if (event.status.activity == ReplicatorActivityLevel.stopped) {
          _status += '\nReplication stopped.';
        } else {
          _status += '\nReplication status: ${event.status.activity}';
        }
      });
      await _replicator.start();
      _status += '\nReplication started.';
    } catch (e) {
      _status += '\nError starting replication: $e';
    }
  }

  [@override](/user/override)
  void dispose() {
    _replicator?.removeChangeListener(_listenerToken);
    _replicator?.stop();
    _replicator?.dispose();
    _database?.close();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Couchbase Lite Example')),
      body: Center(
        child: Text(_status, textAlign: TextAlign.center),
      ),
    );
  }
}

更多关于Flutter嵌入式数据库插件couchbase_lite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter嵌入式数据库插件couchbase_lite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Couchbase Lite 是一个轻量级的、嵌入式的 NoSQL 数据库,适用于移动和桌面应用程序。它提供了本地数据存储、同步和查询功能,非常适合需要在离线状态下工作的应用程序。在 Flutter 中,你可以使用 couchbase_lite 插件来集成 Couchbase Lite 数据库。

以下是如何在 Flutter 项目中使用 couchbase_lite 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 couchbase_lite 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  couchbase_lite: ^2.0.0

然后运行 flutter pub get 来安装依赖。

2. 初始化数据库

在你的 Flutter 应用中,首先需要初始化 Couchbase Lite 数据库。

import 'package:couchbase_lite/couchbase_lite.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化数据库
  final database = await Database.initWithName('my_database');

  runApp(MyApp(database: database));
}

3. 创建和打开数据库

MyApp 类中,你可以使用 Database 对象来创建和打开数据库。

class MyApp extends StatelessWidget {
  final Database database;

  MyApp({required this.database});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Couchbase Lite Example'),
        ),
        body: Center(
          child: Text('Database is ready!'),
        ),
      ),
    );
  }
}

4. 插入数据

你可以使用 Database 对象来插入数据。

void insertData(Database database) async {
  final doc = MutableDocument()
    ..setString('type', 'user')
    ..setString('name', 'John Doe')
    ..setInt('age', 30);

  await database.saveDocument(doc);
}

5. 查询数据

你可以使用 Query 对象来查询数据。

void queryData(Database database) async {
  final query = QueryBuilder.select(SelectResult.all())
      .from(DataSource.database(database))
      .where(Expression.property('type').equalTo(Expression.string('user')));

  final resultSet = await query.execute();
  final results = await resultSet.allResults();

  for (var result in results) {
    print(result.toMap());
  }
}

6. 更新数据

你可以使用 MutableDocument 来更新数据。

void updateData(Database database) async {
  final doc = await database.getDocument('document_id');
  if (doc != null) {
    final mutableDoc = doc.toMutable()
      ..setString('name', 'Jane Doe');

    await database.saveDocument(mutableDoc);
  }
}

7. 删除数据

你可以使用 Database 对象来删除数据。

void deleteData(Database database) async {
  await database.deleteDocument('document_id');
}

8. 同步数据

Couchbase Lite 支持与远程 Couchbase Sync Gateway 进行数据同步。你可以使用 Replicator 来配置同步。

void startReplication(Database database) async {
  final url = Uri.parse('ws://localhost:4984/my_database');
  final target = URLEndpoint(url);

  final config = ReplicatorConfiguration(database, target)
    ..continuous = true;

  final replicator = Replicator(config);
  replicator.start();
}

9. 关闭数据库

在应用程序退出时,记得关闭数据库。

void closeDatabase(Database database) async {
  await database.close();
}

10. 处理错误

在使用 Couchbase Lite 时,可能会遇到各种错误。确保在代码中适当地处理这些错误。

try {
  await database.saveDocument(doc);
} catch (e) {
  print('Error saving document: $e');
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!