Flutter数据库管理插件sqlite_wrapper的使用

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

Flutter数据库管理插件sqlite_wrapper的使用

sqlite_wrapper 是一个简单的 SQLite3 绑定包装库,基于 sqlite3 包。它旨在简化与 SQLite 数据库的工作,提供了一个易于使用的 API,并支持多平台(iOS、Android、MacOS、Windows、Web)。

主要特性

  • 无样板代码
  • 无需生成代码
  • 提供响应式 API
  • 简化模型对象的转换
  • 完全支持 SQL 语言特性
  • 全面测试的代码
  • 多平台支持
  • 没有复杂的魔法,API 简单易用

功能

  • 连接到 SQLite 数据库
  • 执行 SQL 语句
  • 使用编码和解码映射或模型对象操作数据库
  • 通过流实时更新特定查询结果
  • 同时管理多个数据库
  • 在数据库创建或迁移时执行回调

开始使用

安装依赖

  1. 添加 sqlite_wrapper 包到 pubspec.yaml 文件中:

    dependencies:
      sqlite_wrapper: ^latest_version
    
  2. 如果需要在 iOS 和 MacOS 上使用最新版本的 SQLite,请安装并配置 sqlite3_flutter_libs 包。

  3. 如果要在 Flutter Web 中使用该库,请安装并配置 sqflite_common_ffi_web 包,并运行以下命令生成必要的文件:

    $ dart run sqflite_common_ffi_web:setup --force
    

使用示例

初始化数据库

首先,我们需要初始化数据库并创建表:

import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqlite_wrapper/sqlite_wrapper.dart';

Future<void> initDB() async {
  final docDir = await getApplicationDocumentsDirectory();
  if (!await docDir.exists()) {
    await docDir.create(recursive: true);
  }
  await SQLiteWrapper().openDB(p.join(docDir.path, "todoDatabase.sqlite"));
  
  const String createTableSQL = """
    CREATE TABLE IF NOT EXISTS "todos" (
      "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
      "title" varchar(255) NOT NULL,
      "done" int default 0
    );
  """;
  await SQLiteWrapper().execute(createTableSQL);
}

插入数据

Map<String, dynamic> todo = {"title": "New Todo", "done": 0};
int id = await SQLiteWrapper().insert(todo, "todos");
print('Inserted row with id: $id');

查询数据

单条记录查询

Map? todoMap = await SQLiteWrapper().query(
  "SELECT * FROM todos WHERE id = ?",
  params: [1],
  singleResult: true,
);
print(todoMap);

多条记录查询

List<Map> todos = await SQLiteWrapper().query("SELECT * FROM todos");
print(todos);

更新数据

Map<String, dynamic> updatedTodo = {"id": 1, "title": "Updated Todo", "done": 1};
int affectedRows = await SQLiteWrapper().update(updatedTodo, "todos", keys: ["id"]);
print('Updated $affectedRows rows');

删除数据

int deletedRows = await SQLiteWrapper().delete({"id": 1}, "todos", keys: ["id"]);
print('Deleted $deletedRows rows');

监听数据变化

Stream stream = SQLiteWrapper().watch(
  "SELECT COUNT(*) FROM todos",
  singleResult: true,
  tables: ["todos"],
);

stream.listen((event) {
  print('Count of todos: $event');
});

示例项目

下面是一个完整的 Flutter 应用示例,展示如何使用 sqlite_wrapper 插件来管理待办事项列表。

import 'package:flutter/material.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqlite_wrapper/sqlite_wrapper.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化数据库
  await initDB();
  runApp(const MyApp());
}

Future<void> initDB() async {
  final docDir = await getApplicationDocumentsDirectory();
  if (!await docDir.exists()) {
    await docDir.create(recursive: true);
  }
  await SQLiteWrapper().openDB(p.join(docDir.path, "todoDatabase.sqlite"));
  
  const String createTableSQL = """
    CREATE TABLE IF NOT EXISTS "todos" (
      "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
      "title" varchar(255) NOT NULL,
      "done" int default 0
    );
  """;
  await SQLiteWrapper().execute(createTableSQL);
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SQLiteWrapper Sample',
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: const HomePage(title: 'Todos'),
    );
  }
}

class HomePage extends StatefulWidget {
  final String title;

  const HomePage({super.key, required this.title});

  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<Map<String, dynamic>> todos = [];

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

  Future<void> loadTodos() async {
    List<Map> loadedTodos = await SQLiteWrapper().query("SELECT * FROM todos");
    setState(() {
      todos = loadedTodos.cast<Map<String, dynamic>>();
    });
  }

  void addTodo(String title) async {
    Map<String, dynamic> newTodo = {"title": title, "done": 0};
    await SQLiteWrapper().insert(newTodo, "todos");
    loadTodos();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
        itemCount: todos.length,
        itemBuilder: (context, index) {
          final todo = todos[index];
          return ListTile(
            title: Text(todo['title']),
            trailing: Checkbox(
              value: todo['done'] == 1,
              onChanged: (value) {
                todo['done'] = value! ? 1 : 0;
                SQLiteWrapper().update(todo, "todos", keys: ["id"]);
                loadTodos();
              },
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          addTodo("New Todo");
        },
        tooltip: 'Add new todo',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用sqlite_wrapper插件进行数据库管理的代码示例。sqlite_wrapper是一个Flutter插件,它提供了对SQLite数据库的简单封装,使得在Flutter应用中管理数据库变得更加容易。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加sqlite_wrapper的依赖:

dependencies:
  flutter:
    sdk: flutter
  sqlite_wrapper: ^x.y.z  # 请替换为最新版本号

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

2. 初始化数据库

在你的Flutter应用中,你需要初始化数据库并打开一个数据库连接。以下是一个简单的示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter SQLite Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late DatabaseHelper _dbHelper;

  @override
  void initState() {
    super.initState();
    _dbHelper = DatabaseHelper();
    _dbHelper.initializeDatabase().then((_) {
      // 数据库初始化完成后的操作
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter SQLite Demo'),
      ),
      body: Center(
        child: Text('数据库初始化中...'),
      ),
    );
  }
}

class DatabaseHelper {
  Database? _database;

  Future<void> initializeDatabase() async {
    _database = await openDatabase(
      join(await getDatabasesPath(), 'demo.db'),
      onCreate: (db, version) async {
        // 在这里创建表
        await db.execute(
          'CREATE TABLE users ('
          'id INTEGER PRIMARY KEY AUTOINCREMENT,'
          'name TEXT NOT NULL,'
          'email TEXT NOT NULL UNIQUE'
          ')',
        );
      },
      version: 1,
    );
  }

  // 后续可以添加插入、查询、更新、删除等方法
}

3. 插入数据

下面是一个插入数据的示例方法:

class DatabaseHelper {
  // ... 其他代码 ...

  Future<void> insertUser(String name, String email) async {
    final db = _database!;
    await db.insert(
      'users',
      {'name': name, 'email': email},
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }
}

你可以在_MyHomePageState的某个地方调用这个方法,比如在按钮点击事件中:

class _MyHomePageState extends State<MyHomePage> {
  // ... 其他代码 ...

  void _insertSampleData() {
    _dbHelper.insertUser('Alice', 'alice@example.com');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter SQLite Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _insertSampleData,
          child: Text('插入数据'),
        ),
      ),
    );
  }
}

4. 查询数据

下面是一个查询数据的示例方法:

class DatabaseHelper {
  // ... 其他代码 ...

  Future<List<Map<String, dynamic>>> getUsers() async {
    final db = _database!;
    final result = await db.query('users');
    return result;
  }
}

你可以在_MyHomePageState中调用这个方法,并在UI中显示结果:

class _MyHomePageState extends State<MyHomePage> {
  // ... 其他代码 ...

  Future<void> _loadUsers() async {
    final users = await _dbHelper.getUsers();
    // 更新UI,例如使用setState
    setState(() {
      // 假设有一个_users列表保存用户数据
      _users = users;
    });
  }

  List<Map<String, dynamic>> _users = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter SQLite Demo'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: _loadUsers,
            child: Text('加载用户'),
          ),
          Expanded(
            child: _users.isEmpty
                ? Center(child: Text('没有用户数据'))
                : ListView.builder(
                    itemCount: _users.length,
                    itemBuilder: (context, index) {
                      final user = _users[index];
                      return ListTile(
                        title: Text('${user['name']} (${user['email']})'),
                      );
                    },
                  ),
          ),
        ],
      ),
    );
  }
}

总结

以上代码展示了如何在Flutter项目中使用sqlite_wrapper插件进行基本的数据库管理操作,包括初始化数据库、插入数据和查询数据。你可以根据这些示例进一步扩展你的应用,添加更多的数据库操作功能。

回到顶部