在 Flutter 中使用 SQLite 数据库详细步骤

28 min read

在 Flutter 中使用 SQLite 数据库,通常我们会使用 sqflite 库。这个库是一个 SQLite 插件,用于在 Flutter 应用中进行本地数据库操作。接下来,我们将了解如何在 Flutter 中使用和封装 SQLite。

添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path_provider: ^2.0.9

创建一个数据库工具类

新建一个名为 database_helper.dart 的文件,用于封装数据库操作:

import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final _databaseName = "MyDatabase.db";
  static final _databaseVersion = 1;

  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  static Database? _database;
  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  _initDatabase() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, _databaseName);
    return await openDatabase(
      path,
      version: _databaseVersion,
      onCreate: _onCreate,
    );
  }

  Future _onCreate(Database db, int version) async {
    // 在这里创建表和初始化数据
  }
}

创建表

_onCreate 方法中,创建数据库表。例如,我们创建一个 user 表:

Future _onCreate(Database db, int version) async {
  await db.execute('''
    CREATE TABLE user (
      id INTEGER PRIMARY KEY,
      name TEXT NOT NULL,
      age INTEGER NOT NULL
    )
  ''');
}

封装基本操作

接下来,我们需要在 DatabaseHelper 类中封装基本的数据库操作,例如增加、删除、修改和查询。

// 插入数据
Future<int> insert(Map<String, dynamic> row, String tableName) async {
  Database db = await instance.database;
  return await db.insert(tableName, row);
}

// 查询所有数据
Future<List<Map<String, dynamic>>> queryAll(String tableName) async {
  Database db = await instance.database;
  return await db.query(tableName);
}

// 根据条件查询
Future<List<Map<String, dynamic>>> queryByCondition(
  String tableName, {
  required String where,
  required List<dynamic> whereArgs,
}) async {
  Database db = await instance.database;
  return await db.query(tableName, where: where, whereArgs: whereArgs);
}

// 更新数据
Future<int> update(Map<String, dynamic> row, String tableName,
    {required String where, required List<dynamic> whereArgs}) async {
  Database db = await instance.database;
  return await db.update(tableName, row, where: where, whereArgs: whereArgs);
}

// 删除数据
Future<int> delete(String tableName,
    {required String where, required List<dynamic> whereArgs}) async {
  Database db = await instance.database;
  return await db.delete(tableName, where: where, whereArgs: whereArgs);
}

// 分页查询
Future<List<Map<String, dynamic>>> queryPaged(
    String tableName, {
  int perPage = 10,
  int page = 1,
  String orderBy,
  String where,
  List<dynamic> whereArgs,
}) async {
  Database db = await instance.database;

  // 计算偏移量
  int offset = (page - 1) * perPage;

  // 构造查询语句
  StringBuffer query = StringBuffer('SELECT * FROM $tableName');

  // 添加筛选条件
  if (where != null && whereArgs != null) {
    query.write(' WHERE $where');
  }

  // 添加排序条件
  if (orderBy != null) {
    query.write(' ORDER BY $orderBy');
  }

  // 添加分页条件
  query.write(' LIMIT $perPage OFFSET $offset');

  // 执行查询
  return await db.rawQuery(query.toString(), whereArgs);
}

使用封装的数据库工具类

现在我们已经封装了 DatabaseHelper 类,可以在其他地方使用它进行数据库操作。假设我们有一个 User 数据模型:

class User {
  final int id;
  final String name;
  final int age;

  User({required this.id, required this.name, required this.age});

  Map<String, dynamic> toMap() {
    return {'id': id, 'name': name, 'age': age};
  }
}

以下是如何使用 DatabaseHelper 进行数据库操作的示例:

import 'database_helper.dart';
import 'user.dart';

void main() async {
  final dbHelper = DatabaseHelper.instance;

  // 插入数据
  User user1 = User(id: 1, name: 'John Doe', age: 28);
  int id1 = await dbHelper.insert(user1.toMap(), 'user');
  print('插入数据: $id1');

  User user2 = User(id: 2, name: 'Jane Doe', age: 26);
  int id2 = await dbHelper.insert(user2.toMap(), 'user');
  print('插入数据: $id2');

  // 查询所有数据
  List<Map<String, dynamic>> queryRows = await dbHelper.queryAll('user');
  print('查询所有数据: $queryRows');

  // 根据条件查询
  List<Map<String, dynamic>> result = await dbHelper.queryByCondition(
    'user',
    where: 'age > ?',
    whereArgs: [25],
  );
  print('查询年龄大于 25 的用户: $result');

  // 更新数据
  User updatedUser = User(id: 1, name: 'John Doe', age: 30);
  int updatedRows = await dbHelper.update(
    updatedUser.toMap(),
    'user',
    where: 'id = ?',
    whereArgs: [user1.id],
  );
  print('更新数据影响行数: $updatedRows');

  // 删除数据
  int deletedRows = await dbHelper.delete(
    'user',
    where: 'id = ?',
    whereArgs: [user1.id],
  );
  print('删除数据影响行数: $deletedRows');
}

在这个示例中,我们创建了两个 User 对象并将它们插入数据库。然后,我们查询了所有用户和年龄大于 25 的用户。接着,我们更新了一个用户的年龄,并删除了一个用户。

以上就是在 Flutter 中使用 SQLite 的一个简单封装和使用示例。您可以根据自己的需求对 DatabaseHelper 类进行扩展,以便更方便地在应用程序中使用 SQLite 数据库。