Flutter数据库加密插件flutter_sqlcipher的使用

flutter_sqlcipher介绍

flutter_sqlcipher 是一个用于在 Flutter 中使用 SQLCipher 的插件。SQLCipher 是一个开源的 SQLite 扩展库,提供了透明的 256 位 AES 数据库加密功能。

特性:

  • 支持 SQLCipher 的所有功能。
  • 简单易用,适合需要对 SQLite 数据库进行加密的场景。

文档

更多详细信息可以查看官方文档:https://github.com/drydart/flutter_sqlcipher

Bug报告

如遇到问题,可以通过以下链接提交问题:https://github.com/drydart/flutter_sqlcipher/issues


flutter_sqlcipher使用示例

以下是一个完整的示例,展示如何在 Flutter 应用中使用 flutter_sqlcipher 插件。

示例代码

/* This is free and unencumbered software released into the public domain. */

import 'package:flutter/material.dart';
import 'package:flutter_sqlcipher/flutter_sqlcipher.dart'; // 引入 flutter_sqlcipher 插件

// 主屏幕
class MainScreen extends StatelessWidget {
  final db = SQLCipher.openDatabase( // 打开或创建加密数据库
    "example.db", // 数据库文件名
    password: "my_secure_password", // 设置数据库密码
    version: 1, // 数据库版本号
    onCreate: (db) async {
      await db.execute("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT)"); // 创建表
    },
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter SQLCipher 示例"),
      ),
      body: FutureBuilder( // 使用 FutureBuilder 来处理异步操作
        future: db.then((db) => db.query("test")), // 查询数据
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            if (snapshot.hasError) {
              return Center(child: Text("Error: ${snapshot.error}"));
            }
            return ListView.builder(
              itemCount: snapshot.data.length, // 数据长度
              itemBuilder: (context, index) {
                final row = snapshot.data[index];
                return ListTile(
                  title: Text(row["name"]), // 显示数据
                );
              },
            );
          }
          return Center(child: CircularProgressIndicator()); // 加载指示器
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async { // 添加数据按钮
          final db = await SQLCipher.openDatabase(
            "example.db",
            password: "my_secure_password",
          );
          await db.insert("test", {"name": "Flutter"}); // 插入数据
          Navigator.of(context).pop(); // 返回刷新页面
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

// 主应用
void main() => runApp(App());

class App extends StatefulWidget {
  [@override](/user/override)
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      color: Colors.grey,
      theme: ThemeData(
        primaryColor: Colors.black,
        brightness: Brightness.dark,
      ),
      home: MainScreen(), // 启动主屏幕
      routes: <String, WidgetBuilder>{},
    );
  }
}
1 回复

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


flutter_sqlcipher 是一个用于在 Flutter 应用中使用 SQLCipher 加密 SQLite 数据库的插件。SQLCipher 是一个开源的 SQLite 扩展,提供了透明的 256 位 AES 加密,可以保护你的数据库文件不被未经授权的访问。

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

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_sqlcipher: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 flutter_sqlcipher 包:

import 'package:flutter_sqlcipher/flutter_sqlcipher.dart';

3. 打开加密数据库

使用 openDatabase 方法打开一个加密的数据库。你需要提供一个密码来加密和解密数据库。

Future<void> openEncryptedDatabase() async {
  String path = 'path_to_your_database.db';
  String password = 'your_secure_password';

  Database db = await openDatabase(
    path,
    password: password,
  );

  // 现在你可以使用 db 对象来执行 SQL 查询
}

4. 执行 SQL 查询

你可以使用 Database 对象来执行 SQL 查询,例如创建表、插入数据、查询数据等。

Future<void> createTable(Database db) async {
  await db.execute('''
    CREATE TABLE IF NOT EXISTS Users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT,
      age INTEGER
    )
  ''');
}

Future<void> insertUser(Database db, String name, int age) async {
  await db.insert(
    'Users',
    {'name': name, 'age': age},
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

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

5. 关闭数据库

当你不再需要数据库连接时,记得关闭它。

Future<void> closeDatabase(Database db) async {
  await db.close();
}

6. 处理异常

在使用数据库时,可能会遇到各种异常,例如密码错误、数据库损坏等。确保你处理这些异常以提供更好的用户体验。

try {
  Database db = await openDatabase(path, password: password);
  // 执行数据库操作
} catch (e) {
  print('Error: $e');
}

7. 完整示例

以下是一个完整的示例,展示了如何使用 flutter_sqlcipher 插件来创建、插入和查询数据:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  String path = 'path_to_your_database.db';
  String password = 'your_secure_password';

  Database db = await openDatabase(path, password: password);

  await createTable(db);
  await insertUser(db, 'Alice', 30);
  List<Map<String, dynamic>> users = await getUsers(db);
  print(users);

  await closeDatabase(db);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter SQLCipher Example'),
        ),
        body: Center(
          child: Text('Check the console for database output.'),
        ),
      ),
    );
  }
}

Future<void> createTable(Database db) async {
  await db.execute('''
    CREATE TABLE IF NOT EXISTS Users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT,
      age INTEGER
    )
  ''');
}

Future<void> insertUser(Database db, String name, int age) async {
  await db.insert(
    'Users',
    {'name': name, 'age': age},
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

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

Future<void> closeDatabase(Database db) async {
  await db.close();
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!