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

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

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

SQLiteConnection 提供了在 Dart 中与 SQLite 数据库交互的简化接口,支持各种操作如搜索、插入、更新、删除等。

特性

  • 搜索操作:不区分大小写、特定列、多列搜索。
  • 插入操作:单条和批量插入。
  • 更新操作:单条和批量更新,并处理冲突。
  • 删除操作:单条和批量删除。
  • 高级查询:分组、分页和随机行检索。
  • 数据库管理:表创建、删除和备份。

开始使用

pubspec.yaml 文件中添加该包:

dependencies:
  sqlite_flutter_pcl: ^1.0.0

基本用法

初始化

首先,创建一个实现 ISQLiteItem 接口的类来表示数据库表。

import 'package:sqlite_flutter_pcl/sqlite_connection.dart';

class SqlModel implements ISQLiteItem {
  static const String tableName = 'sql_model';
  static const String tableId = 'id';
  static const String tableTitle = 'title';
  static const String tableValue = 'value';

  int? id;
  String? title;
  String? value;

  SqlModel({this.id, this.title, this.value});

  @override
  String getTableName() {
    return tableName;
  }

  @override
  int getPrimaryKey() {
    return id ?? 0;
  }

  @override
  Map<String, dynamic> toMap() {
    return {
      tableId: id,
      tableTitle: title,
      tableValue: value,
    };
  }

  @override
  String getPrimaryKeyName() {
    return tableId;
  }

  @override
  ISQLiteItem fromMap(Map<String, dynamic> map) {
    return SqlModel(
      id: map[tableId],
      title: map[tableTitle],
      value: map[tableValue],
    );
  }
}

创建 SQLiteConnection 实例:

// 初始化 SQLiteConnection 库(如果未初始化)
SQLiteConnection.initDatabaseLib();

// 获取临时数据库文件路径
final databasePath = await getTemporaryDatabaseFilePath();

// 创建 SQLiteConnection 实例
final connection = SQLiteConnection(path: databasePath);

// 创建表
connection.createTable(SqlModel());

// 插入新项
var newItem = SqlModel(title: 'Title 1', value: 'Value 1');
await connection.insert(newItem);

// 检索项
var isqliteItems = await connection.toList(SqlModel());

// 转换为类型列表
var items = isqliteItems.whereType<SqlModel>().toList();
var items = isqliteItems.cast<SqlModel>().toList();

// 更新项
for (var item in items) {
  item.value = 'Updated';
  await connection.update(item);
}

// 或者批量更新
await connection.updateAll(items);

// 删除项
await connection.deleteAll(items);

// 查询单个值
var queryItems = await connection.toListWhere(SqlModel(), 'title', 'Title 1');

// 按值查询项
var queryItems = await connection.searchColumns(SqlModel(), 'title', 'Title 1');

// 返回标题为 'title1' 和 'title2' 的项,使用批处理查询提高效率
var results = await connection.toListWhereValuesAre(SqlModel(), 'title', ['title1', 'title2']);

// 跨多个列搜索
var columnNames = ['word', 'number', 'lemma', 'xlit', 'pronounce', 'description'];
var items = await db.toListColumns(Strongs(), columnNames, query);

// 删除所有表记录
connection.deleteRecords(SqlModel());

// 删除表
connection.dropTable(SqlModel());

Future<String> getTemporaryDatabaseFilePath() async {
  final directory = await getTemporaryDirectory();
  final path = join(directory.path, 'your_database.db');
  print(path);
  return path;
}

插入数据

单条数据

final id = await connection.insert(sqlItem);

多条数据

final totalInserted = await connection.insertAll(sqlItems);

更新数据

单条数据

await connection.update(sqlItem);

多条数据

final totalUpdated = await connection.updateAll(sqlItems);

删除数据

单条数据

final rowsDeleted = await connection.delete(sqlItem);

多条数据

final totalDeleted = await connection.deleteAll(sqlItems);

搜索数据

单列搜索

final results = await connection.search(sqlItem, 'columnName', 'searchQuery');

多列搜索

final results = await connection.searchColumns(
  sqlItem,
  ['column1', 'column2'],
  'searchQuery',
);

精确匹配

final result = await connection.whereColumnHasValue(sqlItem, 'columnName', value);

查询数据

获取所有行

final items = await connection.toList(sqlItem);

过滤行

final items = await connection.toListWhereColumnHasValue(sqlItem, 'columnName', value);

分页行

final items = await connection.paginate(sqlItem, limit: 10, offset: 20);

分组行

final items = await connection.groupBy(
  sqlItem,
  ['column1', 'column2'],
  'groupByColumn',
  orderByColumn: 'orderByColumn',
);

工具函数

  • 备份数据库
await connection.backupDatabase('/path/to/backup.db');
  • 删除表
await connection.dropTable(sqlItem);
  • 清理数据库
await connection.vacuum(sqlItem);
  • 统计行数
final count = await connection.count(sqlItem);
  • 获取表列
final columns = await connection.tableColumns('tableName');

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

1 回复

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


当然,以下是一个使用 sqlite_flutter_pcl 插件进行 Flutter 数据库管理的代码示例。这个插件允许你在 Flutter 应用中直接与 SQLite 数据库进行交互。

首先,确保你已经在 pubspec.yaml 文件中添加了 sqlite_flutter_pcl 依赖:

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

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

接下来,你可以创建一个 Flutter 应用并使用 sqlite_flutter_pcl 插件进行数据库操作。以下是一个简单的示例,展示了如何打开数据库、创建表、插入数据、查询数据以及关闭数据库。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SQLite Flutter PCL Example'),
        ),
        body: DatabaseExample(),
      ),
    );
  }
}

class DatabaseExample extends StatefulWidget {
  @override
  _DatabaseExampleState createState() => _DatabaseExampleState();
}

class _DatabaseExampleState extends State<DatabaseExample> {
  Database? _db;

  @override
  void initState() {
    super.initState();
    _initDatabase();
  }

  Future<void> _initDatabase() async {
    // 打开数据库连接
    _db = await openDatabase(
      join(await getDatabasesPath(), 'example.db'),
      onCreate: (Database db, int version) async {
        // 创建表
        await db.execute('''
          CREATE TABLE users (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            age INTEGER NOT NULL
          )
        ''');
      },
      version: 1,
    );

    // 插入数据
    await _db!.insert(
      'users',
      {'name': 'Alice', 'age': 30},
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
    await _db!.insert(
      'users',
      {'name': 'Bob', 'age': 25},
      conflictAlgorithm: ConflictAlgorithm.replace,
    );

    // 查询数据并更新UI
    setState(() {}); // 这里只是示例,实际上查询数据后应该更新UI组件
  }

  Future<List<Map<String, dynamic>>> _queryUsers() async {
    return await _db!.query('users');
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Map<String, dynamic>>>(
      future: _queryUsers(),
      builder: (BuildContext context, AsyncSnapshot<List<Map<String, dynamic>>> snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          }
          return ListView.builder(
            itemCount: snapshot.data!.length,
            itemBuilder: (BuildContext context, int index) {
              Map<String, dynamic> user = snapshot.data![index];
              return ListTile(
                title: Text('${user['name']} (${user['age']})'),
              );
            },
          );
        } else {
          return Center(child: CircularProgressIndicator());
        }
      },
    );
  }

  @override
  void dispose() {
    // 关闭数据库连接
    _db?.close();
    super.dispose();
  }
}

在这个示例中:

  1. openDatabase 用于打开或创建一个 SQLite 数据库。
  2. onCreate 回调用于在数据库版本为 1 时创建表。
  3. insert 方法用于插入数据到表中。
  4. query 方法用于查询数据。
  5. FutureBuilder 用于在 UI 中异步显示查询结果。
  6. dispose 方法中关闭数据库连接。

请注意,这个示例只是展示了基本的数据库操作。在实际应用中,你可能需要更复杂的错误处理和更细致的 UI 更新逻辑。

回到顶部