Flutter数据库构建插件sql_build_database的使用

Flutter数据库构建插件sql_build_database的使用

sql_build_database 是一个用于简化和快速创建数据库结构的新 Flutter 包。

示例用法

pubspec.yaml 文件中添加依赖:

dependencies:
  sql_build_database: ^1.0.4

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

SBDColumnDataType

SBDColumnDataType 枚举定义了列的数据类型:

  • INTEGER
  • TEXT
  • REAL
  • BLOB
enum SBDColumnDataType {INTEGER, TEXT, REAL, BLOB}

SBDColumn

SBDColumn 类用于定义表的列:

  • name: 列名
  • type: 数据类型
  • isUnique: 是否唯一
  • isNotNull: 是否不允许为空
  • defaultValue: 默认值
  • isPrimaryKey: 是否为主键
  • isAutoIncrement: 是否自动递增
  • foreignKey: 外键引用
SBDColumn(
  name: 'COLUMN_NAME',
  type: SBDColumnDataType.INTEGER,
  isUnique: true,
  isNotNull: true,
  defaultValue: 1,
  isPrimaryKey: true,
  isAutoIncrement: true,
  foreignKey: ['table1', 'COLUM_NAME']
);

SBDTable

SBDTable 类用于定义表结构:

  • name: 表名
  • primaryKeyName: 主键名
  • columns: 列列表
  • initialInserts: 初始插入数据
  • execInitialInserts: 是否执行初始插入
SBDTable(
  name: 'users',
  primaryKeyName: 'USER_CODE',
  columns: [
    SBDColumn(
      name: 'USER_NAME',
      type: SBDColumnDataType.TEXT,
      isNotNull: true,
    ),
    SBDColumn(
      name: 'USER_EMAIL',
      type: SBDColumnDataType.TEXT,
      isNotNull: true,
      isUnique: true,
    ),
    SBDColumn(
      name: 'USER_ACTIVE',
      type: SBDColumnDataType.INTEGER,
      isNotNull: true,
      defaultValue: 1,
    ),
  ],
  initialInserts: [
    {'USER_CODE': 1, 'USER_NAME': 'Danilo Dos Satos Carreiro', 'USER_EMAIL': 'danilocarsan@gmail.com', 'USER_ACTIVE': 1},
  ],
  execInitialInserts: true
)

打印表结构:

print(tb.build());

输出结果:

CREATE TABLE users (
  USER_CODE INTEGER PRIMARY KEY AUTOINCREMENT,
  USER_NAME TEXT NOT NULL,
  USER_EMAIL TEXT NOT NULL UNIQUE,
  USER_ACTIVE INTEGER NOT NULL DEFAULT 1
);

INSERT INTO users(USER_CODE, USER_NAME, USER_EMAIL, USER_ACTIVE) VALUES('1', 'Danilo Dos Satos Carreiro', 'danilocarsan@gmail.com', '1');

打印初始插入语句:

print(tb.initialInserts());

输出结果:

[
  INSERT INTO users(USER_CODE, USER_NAME, USER_EMAIL, USER_ACTIVE) VALUES('1', 'Danilo Dos Satos Carreiro', 'danilocarsan@gmail.com', '1');
]

SBD

SBD 类用于定义多个表的结构:

SBD([
  SBDTable(
    name: 'users',
    primaryKeyName: 'USER_CODE',
    columns: [
      SBDColumn(
        name: 'USER_NAME',
        type: SBDColumnDataType.TEXT,
        isNotNull: true,
      ),
      SBDColumn(
        name: 'USER_EMAIL',
        type: SBDColumnDataType.TEXT,
        isNotNull: true,
        isUnique: true,
      ),
      SBDColumn(
        name: 'USER_ACTIVE',
        type: SBDColumnDataType.INTEGER,
        isNotNull: true,
        defaultValue: 1,
      ),
    ],
    initialInserts: [
      {'USER_CODE': 1, 'USER_NAME': 'Danilo Dos Satos Carreiro', 'USER_EMAIL': 'danilocarsan@gmail.com', 'USER_ACTIVE': 1},
    ],
    execInitialInserts: true
  ),
  SBDTable(
    name: 'logs',
    primaryKeyName: 'LOG_CODE',
    columns: [
      SBDColumn(
        name: 'MESSAGE',
        type: SBDColumnDataType.TEXT,
        isNotNull: true,
      ),
      SBDColumn(
        name: 'LOG_USER_CODE',
        isNotNull: true,
        foreignKey: ['users', 'USER_CODE']
      )
    ]
  )
]);

打印数据库结构:

print(db.build());

输出结果:

CREATE TABLE users (
  USER_CODE INTEGER PRIMARY KEY AUTOINCREMENT,
  USER_NAME TEXT NOT NULL,
  USER_EMAIL TEXT NOT NULL UNIQUE,
  USER_ACTIVE INTEGER NOT NULL DEFAULT 1
);

CREATE TABLE logs (
  LOG_CODE INTEGER PRIMARY KEY AUTOINCREMENT,
  MESSAGE TEXT NOT NULL,
  LOG_USER_CODE TEXT NOT NULL REFERENCES users(USER_CODE),
  FOREIGN KEY (LOG_USER_CODE) REFERENCES users (USER_CODE)
);

获取开始帮助

对于如何开始使用 Flutter,请参阅我们的 在线文档,其中包含教程、示例、移动开发指南和完整的 API 参考。

完整示例

// 导入包
import '../lib/sql_build_database.dart';

void main() {
  // 创建数据库结构
  var db = SBD([
    SBDTable(
      name: 'users',
      primaryKeyName: 'USER_CODE',
      columns: [
        SBDColumn(
          name: 'USER_NAME',
          type: SBDColumnDataType.TEXT,
          isNotNull: true,
        ),
        SBDColumn(
          name: 'USER_EMAIL',
          type: SBDColumnDataType.TEXT,
          isNotNull: true,
          isUnique: true,
        ),
        SBDColumn(
          name: 'USER_ACTIVE',
          type: SBDColumnDataType.INTEGER,
          isNotNull: true,
          defaultValue: 1,
        ),
      ],
      initialInserts: [
        {'USER_CODE': 1, 'USER_NAME': 'Danilo Dos Satos Carreiro', 'USER_EMAIL': 'danilocarsan@gmail.com', 'USER_ACTIVE': 1},
      ],
      execInitialInserts: true
    ),
    SBDTable(
      name: 'logs',
      primaryKeyName: 'LOG_CODE',
      columns: [
        SBDColumn(
          name: 'MESSAGE',
          type: SBDColumnDataType.TEXT,
          isNotNull: true,
        ),
        SBDColumn(
          name: 'LOG_USER_CODE',
          isNotNull: true,
          foreignKey: ['users', 'USER_CODE']
        )
      ]
    )
  ]);

  // 打印数据库结构
  print(db.build());
}

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

1 回复

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


sql_build_database 是一个用于在 Flutter 中构建和管理 SQLite 数据库的插件。它允许你通过 Dart 代码定义数据库表结构,并自动生成创建和升级数据库的 SQL 语句。以下是如何使用 sql_build_database 插件的详细步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sql_build_database 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sql_build_database: ^最新版本

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

2. 定义数据库表结构

接下来,你需要定义数据库中的表结构。你可以通过 Dart 类来定义表结构。例如,假设你要创建一个 User 表:

import 'package:sql_build_database/sql_build_database.dart';

@Table(name: 'User')
class User {
  @PrimaryKey(autoIncrement: true)
  int? id;

  @Column(name: 'name', type: ColumnType.TEXT)
  String name;

  @Column(name: 'age', type: ColumnType.INTEGER)
  int age;

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

3. 创建数据库

使用 DatabaseBuilder 来创建数据库:

import 'package:sql_build_database/sql_build_database.dart';

void main() async {
  // 定义数据库名称和版本
  final databaseBuilder = DatabaseBuilder(
    databaseName: 'my_database.db',
    version: 1,
  );

  // 添加表
  databaseBuilder.addTable(User);

  // 创建数据库
  final database = await databaseBuilder.build();

  // 现在你可以使用 database 对象进行数据库操作
}

4. 数据库操作

你可以使用 database 对象执行常见的数据库操作,如插入、查询、更新和删除数据。

插入数据

final user = User(name: 'Alice', age: 25);
await database.insert(user);

查询数据

final users = await database.query(User);
for (var user in users) {
  print('User: ${user.name}, Age: ${user.age}');
}

更新数据

final user = users.first;
user.name = 'Bob';
await database.update(user);

删除数据

await database.delete(user);

5. 数据库升级

当你需要修改数据库结构时,可以通过增加数据库版本号来触发数据库升级。例如,如果你需要添加一个新表 Post,可以这样做:

@Table(name: 'Post')
class Post {
  @PrimaryKey(autoIncrement: true)
  int? id;

  @Column(name: 'title', type: ColumnType.TEXT)
  String title;

  @Column(name: 'content', type: ColumnType.TEXT)
  String content;

  Post({this.id, required this.title, required this.content});
}

void main() async {
  final databaseBuilder = DatabaseBuilder(
    databaseName: 'my_database.db',
    version: 2, // 增加版本号
  );

  databaseBuilder.addTable(User);
  databaseBuilder.addTable(Post); // 添加新表

  final database = await databaseBuilder.build();
}

6. 处理数据库升级逻辑

如果需要更复杂的升级逻辑,可以通过 onUpgrade 回调来处理:

void main() async {
  final databaseBuilder = DatabaseBuilder(
    databaseName: 'my_database.db',
    version: 2,
  );

  databaseBuilder.addTable(User);
  databaseBuilder.addTable(Post);

  databaseBuilder.onUpgrade = (db, oldVersion, newVersion) async {
    if (oldVersion < 2) {
      // 执行从版本 1 到版本 2 的升级逻辑
      await db.execute('ALTER TABLE User ADD COLUMN email TEXT');
    }
  };

  final database = await databaseBuilder.build();
}

7. 处理数据库降级

如果需要处理数据库降级,可以使用 onDowngrade 回调:

void main() async {
  final databaseBuilder = DatabaseBuilder(
    databaseName: 'my_database.db',
    version: 1, // 降级到版本 1
  );

  databaseBuilder.addTable(User);

  databaseBuilder.onDowngrade = (db, oldVersion, newVersion) async {
    if (oldVersion > 1) {
      // 执行从版本 2 到版本 1 的降级逻辑
      await db.execute('DROP TABLE IF EXISTS Post');
    }
  };

  final database = await databaseBuilder.build();
}
回到顶部