Flutter数据库同步加密插件powersync_sqlcipher的使用

Flutter数据库同步加密插件powersync_sqlcipher的使用

PowerSync与SQLCipher SDK在Flutter中的使用#

PowerSync是一款用于构建具有即时响应UI/UX和简化状态转移的本地优先应用的同步引擎。它可以在客户端SQLite和服务器端Postgres、MongoDB或MySQL之间进行同步。

本包(powersync_sqlcipher) 是为Flutter构建的PowerSync客户端SDK,并启用了SQLCipher加密。目前它处于测试版。这意味着只要经过充分的测试,它就可以在生产环境中安全使用。

如果你的Flutter应用不需要加密功能,我们建议使用powersync SDK。

在你的项目中安装启用SQLCipher加密的PowerSync#

安装最新版本的包,例如:

flutter pub add powersync_sqlcipher

版本历史可以在这里查看:

dart run powersync_sqlcipher:setup_web

用法#

为了加密本地数据库,该SDK需要一些不同于powersync包的设置:

import 'package:powersync_sqlcipher/powersync.dart';

/// 全局引用数据库
late final PowerSyncDatabase db;

final cipherFactory = PowerSyncSQLCipherOpenFactory(
      path: path, key: "sqlcipher-encryption-key"); // https://www.zetetic.net/sqlcipher/sqlcipher-api/#key

db = PowerSyncDatabase.withFactory(cipherFactory, schema: schema);

开始使用#

我们的完整的SDK参考文档包含了你需要了解的所有信息,以便在你的项目中实现PowerSync。

变更日志#

该SDK的变更日志可以在这里查看:

https://pub.dev/packages/powersync_sqlcipher/changelog

API参考#

该SDK的完整API参考文档可以在这里查看:

https://pub.dev/documentation/powersync_sqlcipher/latest/powersync_sqlcipher/powersync_sqlcipher-library.html

示例#

有关使用PowerSync和Flutter构建的示例项目,请参阅我们的演示应用/示例项目画廊。大多数这些项目也可以在demos/目录中找到。

发现错误或需要帮助?#

  • 加入我们的Discord服务器,在那里你可以浏览社区话题,提出问题,分享反馈,或者只是打个招呼 :)

  • 当你遇到错误时,请打开一个GitHub问题

  • 如果你有反馈或想法,请通过我们的公共路线图提交一个想法,或者与我们产品团队的一名成员安排一次聊天


完整示例代码

import 'package:flutter/foundation.dart';
import 'package:powersync_sqlcipher/powersync.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';

const schema = Schema([
  Table('customers', [Column.text('name'), Column.text('email')])
]);

late PowerSyncDatabase db;

// 设置连接到后端的连接器,如果你想同步数据。
class BackendConnector extends PowerSyncBackendConnector {
  PowerSyncDatabase db;

  BackendConnector(this.db);
  [@override](/user/override)
  // 忽略: 可能会正常返回空值
  Future<PowerSyncCredentials?> fetchCredentials() async {
    // 实现fetchCredentials
  }
  [@override](/user/override)
  Future<void> uploadData(PowerSyncDatabase database) async {
    // 实现uploadData
  }
}

openDatabase() async {
  var path = 'powersync-demo.db';
  // getApplicationSupportDirectory在Web上不受支持
  if (!kIsWeb) {
    final dir = await getApplicationSupportDirectory();
    path = join(dir.path, 'powersync-dart.db');
  }

  // 设置数据库
  final cipherFactory = PowerSyncSQLCipherOpenFactory(
      path: path, key: "sqlcipher-encryption-key");

  db = PowerSyncDatabase.withFactory(cipherFactory, schema: schema);

  await db.initialize();

  // 运行本地语句
  await db.execute(
      'INSERT INTO customers(id, name, email) VALUES(uuid(), ?, ?)',
      ['Fred', 'fred@example.org']);

  // 连接到后端
  db.connect(connector: BackendConnector(db));
}

更多关于Flutter数据库同步加密插件powersync_sqlcipher的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在Flutter项目中,使用powersync_sqlcipher插件可以实现数据库的同步和加密功能。以下是一个示例代码,展示了如何设置和使用powersync_sqlcipher插件。

1. 添加依赖

首先,在pubspec.yaml文件中添加powersync_sqlcipher依赖:

dependencies:
  flutter:
    sdk: flutter
  powersync_sqlcipher: ^最新版本号

然后运行flutter pub get来获取依赖。

2. 配置数据库加密

接下来,配置数据库加密密钥。通常在应用启动时设置。

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

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

  // 设置数据库加密密钥
  await PowersyncSqlcipher.configure(
    key: 'your-encryption-key', // 替换为你的加密密钥
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Powersync Sqlcipher Example'),
        ),
        body: Center(
          child: Text('Database is configured with encryption'),
        ),
      ),
    );
  }
}

3. 打开或创建数据库

使用PowersyncSqlcipher打开或创建一个加密数据库。

import 'package:powersync_sqlcipher/powersync_sqlcipher.dart';

Future<Database> openDatabase() async {
  return await PowersyncSqlcipher.openDatabase(
    path: 'your_database.db', // 数据库文件路径
    version: 1, // 数据库版本
    onConfigure: (db) async {
      // 在这里可以配置数据库,例如创建表等
      await db.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)');
    },
    onOpen: (db) async {
      // 数据库打开时的回调
      print('Database opened');
    },
    onUpgrade: (db, oldVersion, newVersion) async {
      // 数据库升级时的回调
      print('Upgrading database from $oldVersion to $newVersion');
    },
    onDowngrade: (db, oldVersion, newVersion) async {
      // 数据库降级时的回调
      print('Downgrading database from $oldVersion to $newVersion');
    },
  );
}

4. 执行数据库操作

一旦数据库打开,你可以执行CRUD操作。

Future<void> insertUser(Database db, String name) async {
  await db.insert('users', {'name': name});
}

Future<List<Map<String, dynamic>>> queryUsers(Database db) async {
  return await db.query('users');
}

Future<void> mainDatabaseOperations() async {
  Database db = await openDatabase();

  // 插入用户
  await insertUser(db, 'Alice');
  await insertUser(db, 'Bob');

  // 查询用户
  List<Map<String, dynamic>> users = await queryUsers(db);
  print('Users: $users');

  // 关闭数据库
  await db.close();
}

5. 运行应用

将上述代码整合到你的Flutter应用中,并运行应用。确保在适当的位置调用mainDatabaseOperations函数以执行数据库操作。

注意事项

  • 确保在调用任何数据库操作之前已经正确配置了加密密钥。
  • 根据实际需求处理数据库版本升级和降级。
  • 加密密钥应妥善保管,避免硬编码在代码中。

通过上述步骤,你可以在Flutter项目中使用powersync_sqlcipher插件实现加密数据库的同步操作。

回到顶部