Flutter嵌入式数据库插件couchbase_lite的使用
Flutter嵌入式数据库插件couchbase_lite的使用
couchbase_lite plugin
一个用于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):
- 添加beer-sample桶:设置 -> 示例桶
- 在Couchbase Server的安全性下创建sync_gateway用户
- 授予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
更多关于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');
}