Flutter数据库生成与操作插件sqfentity_gen的使用

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

Flutter数据库生成与操作插件sqfentity_gen的使用

sqfentity_gen 是一个用于Flutter的代码生成器插件,主要用于SQLite数据库的操作。它简化了数据库表的定义、查询和管理。以下是详细的使用指南。

开始使用

首先,你需要从GitHub获取更多信息:sqfEntity GitHub

步骤 1: 导入必要的包

在你的Dart文件中导入以下包:

import 'package:sqfentity/sqfentity.dart';
import 'package:sqfentity_gen/sqfentity_gen.dart';

步骤 2: 定义表结构

定义你的表结构作为SqfEntityTable常量。例如:

const SqfEntityTable tableCategory = SqfEntityTable(
    tableName: 'category',
    primaryKeyName: 'id',
    primaryKeyType: PrimaryKeyType.integer_auto_incremental,
    useSoftDeleting: true,
    fields: [
      SqfEntityField('name', DbType.text),
      SqfEntityField('isActive', DbType.bool, defaultValue: true),
    ]);

步骤 3: 创建数据库模型

创建你的数据库模型实例,包含之前定义的所有表:

@SqfEntityBuilder(myDbModel)
const SqfEntityModel myDbModel = SqfEntityModel(
    modelName: null,
    databaseName: 'sampleORM.db',
    databaseTables: [tableCategory],
    sequences: [],
);

步骤 4: 运行代码生成器

在终端运行以下命令以生成代码:

flutter pub run build_runner build --delete-conflicting-outputs

检查 lib/model/model.g.dart 文件确保代码已正确生成。

示例代码

以下是一个完整的示例,展示了如何添加产品、打印类别列表以及执行各种查询操作:

import 'package:flutter/material.dart';
import 'package:sqfentity/sqfentity.dart';
import 'package:sqfentity_gen/sqfentity_gen.dart';

// 定义表结构
const SqfEntityTable tableProduct = SqfEntityTable(
    tableName: 'product',
    primaryKeyName: 'id',
    primaryKeyType: PrimaryKeyType.integer_auto_incremental,
    fields: [
      SqfEntityField('name', DbType.text),
      SqfEntityField('description', DbType.text),
      SqfEntityField('price', DbType.real, defaultValue: 0),
      SqfEntityField('isActive', DbType.bool, defaultValue: true),
    ]);

@SqfEntityBuilder(myDbModel)
const SqfEntityModel myDbModel = SqfEntityModel(
    modelName: null,
    databaseName: 'sampleORM.db',
    databaseTables: [tableProduct],
);

void main(List<String> args) async {
  WidgetsFlutterBinding.ensureInitialized();
  await runSamples();
}

Future<bool> runSamples() async {
  await addSomeProducts();
  printCategories(false);
  return true;
}

Future<void> addSomeProducts() async {
  // 添加一些产品到数据库
  await Product(
    name: 'Sample Product',
    description: 'This is a sample product',
    price: 99.99,
    isActive: true,
  ).save();
}

Future<void> printCategories(bool getIsDeleted) async {
  final categoryList = await Category().select(getIsDeleted: getIsDeleted).toList();
  print('LISTING CATEGORIES -> Category().select().toList()');
  print('${categoryList.length} matches found:');
  for (int i = 0; i < categoryList.length; i++) {
    print(categoryList[i].toMap());
  }
  print('---------------------------------------------------------------\n\n');
}

查询示例

这里有一些查询示例,展示如何使用sqfentity进行复杂查询:

示例 1.1: 获取所有产品

await printProducts();

Future<void> printProducts() async {
  final productList = await Product().select().toList();
  print('EXAMPLE 1.1: SELECT ALL ROWS WITHOUT FILTER ex: SELECT * FROM PRODUCTS \n -> Product().select().toList()');
  print('${productList.length} matches found:');
  for (int i = 0; i < productList.length; i++) {
    print(productList[i].toMap());
  }
  print('---------------------------------------------------------------\n\n');
}

示例 1.2: 排序查询结果

var productList = await Product()
    .select()
    .orderBy('name')
    .orderByDesc('price')
    .orderBy('id')
    .toList();
print('EXAMPLE 1.2: ORDER BY FIELDS ex: SELECT * FROM PRODUCTS ORDER BY name, price DESC, id \n-> Product().select().orderBy(\'name\').orderByDesc(\'price\').orderBy(\'id\').toList()');

示例 1.3: 选择特定字段

productList = await Product()
    .select(columnsToSelect: ['name', 'price'])
    .orderByDesc('price')
    .toList();
print('EXAMPLE 1.3: SELECT SPECIFIC FIELDS ex: SELECT name,price FROM PRODUCTS ORDER BY price DESC \n-> Product().select(columnsToSelect:[\'name\',\'price\']).orderByDesc(\'price\').toList()');

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用 sqfentity_gen 插件来生成和操作数据库的示例。sqfentity_gen 是一个帮助简化Flutter中SQLite数据库操作的代码生成工具。它依赖于 floor 库来提供数据库抽象层。

1. 添加依赖

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

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

dev_dependencies:
  build_runner: ^2.0.0 # 用于代码生成
  sqfentity_gen: ^0.x.x # 请使用最新版本
  floor_generator: ^1.0.0 # floor的代码生成器

2. 创建数据模型

创建一个数据模型,比如 User,并使用 @Entity 注解:

import 'package:floor/floor.dart';

@Entity(tableName: 'users')
class User {
  @PrimaryKey(autoGenerate: true)
  final int id;
  final String name;
  final int age;

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

3. 创建 DAO 接口

DAO(Data Access Object)接口用于定义数据库操作。使用 @Dao 注解:

import 'package:floor/floor.dart';
import 'user.dart';

@Dao
abstract class UserDao {
  @Query('SELECT * FROM users')
  Future<List<User>> findAllUsers();

  @Insert(onConflict: OnConflictStrategy.replace)
  Future<void> insertUser(User user);

  @Update(onConflict: OnConflictStrategy.replace)
  Future<void> updateUser(User user);

  @Delete
  Future<void> deleteUser(User user);
}

4. 创建数据库抽象类

使用 @Database 注解来定义数据库抽象类:

import 'package:floor/floor.dart';
import 'user.dart';
import 'user_dao.dart';

@Database(version: 1, entities: [User])
abstract class AppDatabase extends FloorDatabase {
  UserDao get userDao;
}

5. 生成代码

在项目根目录下运行以下命令来生成数据库代码:

flutter pub run build_runner build

6. 使用数据库

现在你可以在你的 Flutter 应用中使用生成的数据库代码了。例如,在 main.dart 中:

import 'package:flutter/material.dart';
import 'package:my_app/app_database.g.dart'; // 导入生成的数据库文件
import 'package:my_app/user.dart';
import 'package:my_app/user_dao.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final database = await $FloorAppDatabase.databaseBuilder('my_database.db').build();
  runApp(MyApp(database.userDao));
}

class MyApp extends StatelessWidget {
  final UserDao userDao;

  MyApp(this.userDao);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Database Example')),
        body: FutureBuilder<List<User>>(
          future: userDao.findAllUsers(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              final users = snapshot.data ?? [];
              return ListView.builder(
                itemCount: users.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('${users[index].name} (${users[index].age})'),
                  );
                },
              );
            } else {
              return Center(child: CircularProgressIndicator());
            }
          },
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            await userDao.insertUser(User(name: 'Alice', age: 30));
            // 重新获取数据以显示新插入的用户
            setState(() {}); // 注意:这里实际上需要StatefulWidget来正确刷新UI
          },
          tooltip: 'Add User',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

注意:由于 main.dart 中的 MyApp 是一个 StatelessWidget,直接使用 setState(() {}) 是不可行的。为了刷新UI,你需要将 MyApp 改为 StatefulWidget 或者使用其他状态管理方案。

上述代码展示了如何使用 sqfentity_genfloor 来创建和操作Flutter中的SQLite数据库。记得根据你的具体需求调整代码。

回到顶部