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

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

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

Sqlcool 是一个用于 Flutter 的数据库助手库,基于 Sqflite。它帮助开发者专注于业务逻辑,而无需关心底层实现细节。

特性

  • 简单:提供简单的 CRUD 操作 API。
  • 响应式:支持数据库变更流和响应式查询。
  • 可适配:可以将自定义模型与数据库集成。

更多详细信息请参考 官方文档API 文档


简单的 CRUD 操作

定义数据库模式

import 'package:sqlcool/sqlcool.dart';

Db db = Db();
// 定义数据库表结构
DbTable category = DbTable("category")..varchar("name", unique: true);
DbTable product = DbTable("product")
   ..varchar("name", unique: true)
   ..integer("price")
   ..text("description", nullable: true)
   ..foreignKey("category", onDelete: OnDelete.cascade)
   ..index("name");
List<DbTable> schema = [category, product];

初始化数据库

String dbPath = "db.sqlite"; // 数据库文件路径(相对于文档目录)
try {
  await db.init(path: dbPath, schema: schema);
} catch(e) {
  rethrow;
}

插入数据

final Map<String, String> row = {"name": "My Item"};
try {
  int id = await db.insert(table: "category", row: row);
} catch(e) {
  rethrow;
}

查询数据

try {
  List<Map<String, dynamic>> rows = await db.select(
    table: "product",
    limit: 20,
    columns: "id,name",
    where: "name LIKE '%something%'",
    orderBy: "name ASC",
  );
} catch (e) {
  rethrow;
}

更新数据

try {
  int numRowsUpdated = await db.update(table: "category", 
   row: row, where: "id=1");
} catch(e) {
  rethrow;
}

删除数据

try {
  await db.delete(table: "category", where: "id=3");
} catch(e) {
  rethrow;
}

联合查询

try {
  final data = await db.join(
   table: "product",
   columns: "product.name,price,category.name as category_name",
   joinTable: "category",
   joinOn: "product.category=category.id");
} catch(e) {
  rethrow;
}

多表联合查询

try {
  final data = db.mJoin(table: "product", joinsTables: [
   "category",
   "manufacturer"
 ], joinsOn: [
   "product.category=category.id",
   "product.manufacturer=manufacturer.id"
 ]);
} catch(e) {
  rethrow;
}

响应式功能

变更流(Changefeed)

import 'dart:async';
import 'package:sqlcool/sqlcool.dart';

StreamSubscription changefeed;

changefeed = db.changefeed.listen((change) {
   print("Change in the database:");
   print("Query: ${change.query}");
   if (change.type == DatabaseChange.update) {
     print("${change.value} items updated");
   }
 });
// 停止监听时取消订阅
changefeed.cancel();

响应式查询(Reactive Select Bloc)

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

class _PageSelectBlocState extends State<PageSelectBloc> {
  SelectBloc bloc;

  [@override](/user/override)
  void initState() {
    super.initState();
    this.bloc = SelectBloc(
        table: "items", orderBy: "name", reactive: true);
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("My App")),
      body: StreamBuilder<List<Map>>(
          stream: bloc.items,
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              // 查询结果为空
              if (snapshot.data.length == 0) {
                return Center(child: const Text("No Data"));
              }
              // 查询结果有数据
              return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    var item = snapshot.data[index];
                    return ListTile(
                      title: GestureDetector(
                        child: Text(item["name"]),
                        onTap: () => someFunction()),
                    );
                  });
            } else {
              // 查询正在进行中
              return CircularProgressIndicator();
            }
          }),
    );
  }
}

class PageSelectBloc extends StatefulWidget {
  [@override](/user/override)
  _PageSelectBlocState createState() => _PageSelectBlocState();
}

使用数据库模型

定义数据库模型

schema.dart 中定义表结构:

final carTable = DbTable("car")
  ..varchar("name")
  ..integer("max_speed")
  ..real("price")
  ..integer("year")
  ..boolean("is_4wd", defaultValue: false)
  ..foreignKey("manufacturer", onDelete: OnDelete.cascade);

final manufacturerTable = DbTable("manufacturer")..varchar("name");

car_model.dart 中定义模型类:

import 'package:sqlcool/sqlcool.dart';
import 'schema.dart';
import 'manufacturer_model.dart';

class Car with DbModel {
  Car({
    this.id,
    this.name,
    this.maxSpeed,
    this.price,
    this.year,
    this.is4wd,
    this.manufacturer,
  });

  final String name;
  final int maxSpeed;
  final double price;
  final DateTime year;
  final bool is4wd;
  Manufacturer manufacturer;

  [@override](/user/override)
  int id;

  [@override](/user/override)
  Db get db => db;

  [@override](/user/override)
  DbTable get table => carTable;

  [@override](/user/override)
  Map<String, dynamic> toDb() {
    assert(manufacturer?.id != null);
    return {
      "name": name,
      "max_speed": maxSpeed,
      "price": price,
      "year": year.millisecondsSinceEpoch,
      "is_4wd": is4wd,
      "manufacturer": manufacturer.id,
    };
  }

  [@override](/user/override)
  Car fromDb(Map<String, dynamic> map) {
    return Car(
      id: map["id"] as int,
      name: map["name"].toString(),
      maxSpeed: map["max_speed"] as int,
      price: map["price"] as double,
      year: DateTime.fromMillisecondsSinceEpoch(map["year"] as int),
      is4wd: (map["is_4wd"].toString() == "true"),
    );
  }

  static Future<List<Car>> selectRelated({String where, int limit}) async {
    final cars = List<Car>.from(await Car().sqlJoin(where: where, limit: limit));
    return cars;
  }
}

使用模型

await car.sqlInsert();
await car.sqlUpdate();
await car.sqlUpsert();
await car.sqlDelete();

final cars = Car.selectRelated(where: "speed>200");
print(cars[0].manufacturer.name);

示例代码

以下是一个完整的示例代码,展示了如何初始化数据库并使用 Sqlcool 进行操作:

import 'package:flutter/material.dart';

import 'conf.dart';
import 'dbmodels/dbmodels.dart';
import 'dbviewer/dbviewer.dart';
import 'init_db.dart';
import 'pages/index.dart';
import 'pages/join.dart';
import 'pages/select_bloc.dart';
import 'pages/upsert.dart';

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

  // 异步初始化数据库
  initDb(db: db);
  initDb2(db: db2);
}

final routes = {
  '/': (BuildContext context) => PageIndex(),
  '/select_bloc': (BuildContext context) => PageSelectBloc(),
  '/join': (BuildContext context) => PageJoinQuery(),
  '/upsert': (BuildContext context) => UpsertPage(),
  '/dbmodel': (BuildContext context) => DbModelPage(),
  '/dbmanager': (BuildContext context) => DbViewer(db: db),
};

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Sqlcool Example',
      routes: routes,
    );
  }
}

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

1 回复

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


sqlcool 是一个用于 Flutter 的数据库管理插件,它基于 SQLite 并提供了一种更简单、更直观的方式来管理数据库操作。sqlcool 提供了类似于 ORM(对象关系映射)的功能,使得开发者可以更方便地操作数据库。

安装 sqlcool

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

dependencies:
  flutter:
    sdk: flutter
  sqlcool: ^1.0.0  # 请使用最新版本

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

基本用法

1. 创建数据库

首先,你需要创建一个数据库实例。你可以通过 DatabaseBuilder 来配置数据库。

import 'package:sqlcool/sqlcool.dart';

final db = DatabaseBuilder(path: "my_database.db")
    .addTable(
        table: "users",
        columns: [
          Column.integer("id", isPrimaryKey: true),
          Column.text("name"),
          Column.integer("age"),
        ])
    .build();

2. 打开数据库

在使用数据库之前,你需要打开它:

await db.open();

3. 插入数据

你可以使用 insert 方法来插入数据:

final id = await db.insert("users", {"name": "John", "age": 30});
print("Inserted user with id: $id");

4. 查询数据

你可以使用 query 方法来查询数据:

final users = await db.query("users");
for (final user in users) {
  print("User: ${user["name"]}, Age: ${user["age"]}");
}

你也可以使用 where 条件来过滤查询结果:

final users = await db.query("users", where: "age > ?", whereArgs: [25]);

5. 更新数据

你可以使用 update 方法来更新数据:

final rowsUpdated = await db.update("users", {"age": 31}, where: "id = ?", whereArgs: [1]);
print("Updated $rowsUpdated rows");

6. 删除数据

你可以使用 delete 方法来删除数据:

final rowsDeleted = await db.delete("users", where: "id = ?", whereArgs: [1]);
print("Deleted $rowsDeleted rows");

7. 关闭数据库

当你不再需要使用数据库时,可以关闭它:

await db.close();

高级用法

1. 事务处理

sqlcool 支持事务处理,你可以使用 transaction 方法来执行一系列操作:

await db.transaction((txn) async {
  await txn.insert("users", {"name": "Alice", "age": 25});
  await txn.update("users", {"age": 26}, where: "name = ?", whereArgs: ["Alice"]);
});

2. 批量操作

你可以使用 batch 方法来执行批量操作:

final batch = db.batch();
batch.insert("users", {"name": "Bob", "age": 28});
batch.update("users", {"age": 29}, where: "name = ?", whereArgs: ["Bob"]);
await batch.commit();

3. 监听数据变化

sqlcool 提供了数据变化监听功能,你可以监听特定表的数据变化:

db.onTable("users").listen((event) {
  print("Table 'users' changed: $event");
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!