Flutter数据库生成与操作插件sqfentity_gen的使用
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
更多关于Flutter数据库生成与操作插件sqfentity_gen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用 sqfentity_gen
插件来生成和操作数据库的示例。sqfentity_gen
是一个帮助简化Flutter中SQLite数据库操作的代码生成工具。它依赖于 floor
库来提供数据库抽象层。
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 floor
和 sqfentity_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_gen
和 floor
来创建和操作Flutter中的SQLite数据库。记得根据你的具体需求调整代码。