Flutter数据库生成插件floor_generator的使用

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

Flutter数据库生成插件floor_generator的使用

Floor简介

Floor是一个为Flutter应用程序(iOS、Android、Linux、macOS、Windows)提供的类型安全、反应式和轻量级的SQLite抽象层。它来源于Android的Room库,是应用数据库层的基础,同时“fl”也指明了该库适用于Flutter环境。

示例代码

下面将提供一个完整的示例demo来展示如何在Flutter项目中使用floor_generator

依赖配置

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

dependencies:
  floor: ^1.3.0 # 确保版本号是最新的稳定版
  sqlite3_flutter_libs: any # SQLite3支持

dev_dependencies:
  build_runner: ^2.0.0
  floor_generator: ^1.3.0 # 确保版本号与floor保持一致

然后运行命令安装这些包:

flutter pub get

创建实体类

接下来,定义一个实体类。例如,我们创建一个名为User的实体:

import 'package:floor/floor.dart';

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

  final String name;

  final String email;

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

  // 必须实现copyWith方法用于更新对象
  User copyWith({
    int? id,
    String? name,
    String? email,
  }) =>
      User(
        id: id ?? this.id,
        name: name ?? this.name,
        email: email ?? this.email,
      );
}

定义DAO接口

接着,定义一个数据访问对象(DAO),用于操作User实体:

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

@dao
abstract class UserDao {
  @Insert(onConflict: OnConflictStrategy.replace)
  Future<int> insertUser(User user);

  @Query('SELECT * FROM users')
  Future<List<User>> findAllUsers();
}

创建数据库

最后,创建一个继承自FloorDatabase的类,将前面定义的DAO注册进去:

import 'package:floor/floor.dart';
import 'dart:async';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart' as sqflite;
import '../dao/user_dao.dart';
import '../entities/user.dart';

part 'app_database.g.dart'; // the generated code will be there

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

注意:你需要确保文件名和part指令中的路径匹配,并且在同一个目录下。此外,还需保证AppDatabase类的文件名以.dart结尾,而生成的代码文件将以.g.dart结尾。

生成代码

完成上述步骤后,你可以通过以下命令生成必要的代码:

flutter pub run build_runner build

这将在指定的位置生成对应的.g.dart文件,其中包含了所有需要的实现。

使用数据库

现在你可以在应用程序中使用这个数据库了。例如,在主函数中初始化并执行一些操作:

import 'package:flutter/material.dart';
import 'package:floor/floor.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';
import 'database/app_database.dart';
import 'entities/user.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();
  final userDao = database.userDao;

  runApp(MyApp(userDao));
}

class MyApp extends StatelessWidget {
  final UserDao userDao;

  MyApp(this.userDao);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Floor Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 插入新用户
              final user = User(name: 'John Doe', email: 'john.doe@example.com');
              await userDao.insertUser(user);

              // 查询所有用户
              final users = await userDao.findAllUsers();
              print(users);
            },
            child: Text('Add User'),
          ),
        ),
      ),
    );
  }
}

以上就是使用floor_generator在Flutter项目中集成SQLite数据库的基本流程。希望这个例子能帮助你更好地理解和使用这个强大的工具!

如果你有任何问题或遇到困难,请随时查阅官方文档或前往GitHub Issues寻求帮助。


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

1 回复

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


当然,下面是一个关于如何使用Flutter数据库生成插件floor_generator的示例代码。这个示例将展示如何设置一个简单的数据库、定义一个实体类、创建一个DAO(数据访问对象),并使用Floor生成相关的数据库代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  floor: ^1.0.0 # 请检查最新版本号

dev_dependencies:
  build_runner: ^2.0.0 # 请检查最新版本号
  floor_generator: ^1.0.0 # 请检查最新版本号

2. 创建实体类

定义一个简单的实体类,例如User

import 'package:floor/floor.dart';

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

  @ColumnInfo(name: 'name')
  final String name;

  User({required this.name});
}

3. 创建DAO接口

定义一个DAO接口来执行数据库操作:

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

@Dao
abstract class UserDao {
  @Insert(onConflict: OnConflictStrategy.replace)
  Future<void> insertUser(User user);

  @Query('SELECT * FROM users')
  Future<List<User>> getAllUsers();

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

4. 定义数据库类

定义一个数据库类来管理数据库连接:

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

这将生成一个AppDatabase的实现类,你可以在应用的其它部分使用这个实现类。

6. 使用数据库

在你的Flutter应用中打开数据库并执行一些操作:

import 'package:flutter/material.dart';
import 'package:my_app/database/app_database.dart';
import 'package:my_app/database/user.dart';
import 'package:floor/floor.dart';

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

class MyApp extends StatelessWidget {
  final AppDatabase database;

  MyApp({required this.database});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(database: database),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final AppDatabase database;

  MyHomePage({required this.database});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<List<User>>? _usersFuture;

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

  Future<void> _initializeDatabase() async {
    final User user = User(name: 'Alice');
    await widget.database.userDao.insertUser(user);

    setState(() {
      _usersFuture = widget.database.userDao.getAllUsers();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Floor Example'),
      ),
      body: FutureBuilder<List<User>>(
        future: _usersFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            }
            return ListView.builder(
              itemCount: snapshot.data!.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('User ${snapshot.data![index].name}'),
                );
              },
            );
          } else {
            return CircularProgressIndicator();
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final User user = User(name: 'Bob');
          await widget.database.userDao.insertUser(user);

          setState(() {
            _usersFuture = widget.database.userDao.getAllUsers();
          });
        },
        tooltip: 'Add User',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它使用Floor数据库来存储和检索用户信息。在应用的初始化阶段,我们插入了一个用户,并在UI中显示所有用户。通过点击浮动操作按钮,可以添加新用户。

希望这个示例能够帮助你理解如何使用floor_generator插件。如果你有任何其他问题,请随时提问!

回到顶部