Flutter数据库访问插件floor_common的使用

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

Flutter数据库访问插件floor_common的使用

安全、响应式且轻量级的SQLite抽象库,适用于您的Flutter应用程序(iOS、Android、Linux、macOS、Windows)

请勿导入此包! 您应该使用包含所有注解的floor包。将这些包分开开发库有一些好处,但对用户来说并没有什么用处。

库名的来源如下。 Floor作为Room底层,指代数据库层是大多数应用程序的基础层。 而fl也表明该库在Flutter环境中使用。

Bugs和反馈

如遇到问题、疑问或讨论,请使用GitHub Issues

许可证

版权所有 2021 The Floor Project 作者

根据Apache许可证2.0版("许可证")授权;
除非适用法律要求或书面同意,否则根据许可证分发的软件按"原样"分发,
不附带任何明示或暗示的保证或条件。有关许可证下管理权限和限制的具体语言,请参阅许可证。

示例代码

1. 添加依赖项

pubspec.yaml文件中添加以下依赖项:

dependencies:
  floor: ^0.10.0
  floor_generator: ^0.10.0
  build_runner: ^2.1.7

2. 创建实体类

创建一个实体类来表示数据库表中的数据。例如,我们创建一个名为User的实体类:

import 'package:floor/floor.dart';

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

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

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

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

3. 创建DAO接口

创建一个DAO(Data Access Object)接口来定义数据库操作方法:

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

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

  @insert
  Future<void> insertUser(User user);

  @delete
  Future<void> deleteUser(User user);

  @update
  Future<void> updateUser(User user);
}

4. 创建数据库实例

创建一个继承自FloorDatabase的类来定义数据库操作:

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

part 'database.g.dart'; // 由build_runner生成的文件

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

5. 生成必要的代码

运行以下命令以生成必要的代码:

flutter pub run build_runner build

6. 使用数据库

现在可以在应用中使用数据库了。例如,在一个页面中插入用户数据:

import 'package:flutter/material.dart';
import 'package:floor_example/database.dart'; // 假设这是你的数据库类
import 'package:floor_example/user.dart'; // 假设这是你的实体类

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

  runApp(MyApp(userDao: userDao));
}

class MyApp extends StatelessWidget {
  final UserDao userDao;

  MyApp({required this.userDao});

  [@override](/user/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);
              print('User inserted: ${user.name}');
            },
            child: Text('Insert User'),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter项目中,floor 是一个流行的数据库访问插件,它提供了对SQLite数据库的抽象,使得数据持久化操作变得更加简单和类型安全。floor_common 通常是 floor 插件的一部分,用于定义一些通用的类型和工具。

以下是一个使用 floor 插件进行数据库访问的完整示例,包括定义数据模型、DAO(数据访问对象)以及打开数据库连接。请注意,虽然 floor_common 并不是直接引用的库(它通常作为 floor 的一部分被包含),但我们将使用 floor 插件的功能来展示数据库访问。

1. 添加依赖

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

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

dev_dependencies:
  build_runner: ^2.0.0
  floor_generator: ^1.0.0  # 确保与 floor 版本匹配

2. 定义数据模型

创建一个数据模型类,并使用 @Entity 注解标记它。

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 接口,用于数据库操作,并使用 @Dao 注解标记它。

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

@Dao
interface 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. 定义数据库

创建一个数据库抽象类,并使用 @Database 注解标记它,同时指定 DAO 和数据库版本。

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

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

5. 打开数据库连接

在你的 Flutter 应用中打开数据库连接。

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

Future<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> {
  @override
  void initState() {
    super.initState();
    _insertUser();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Floor Example')),
      body: FutureBuilder<List<User>>(
        future: widget.database.userDao.getAllUsers(),
        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));
              },
            );
          } else {
            return CircularProgressIndicator();
          }
        },
      ),
    );
  }
}

6. 生成代码

在项目根目录下运行以下命令以生成 floor 所需的代码:

flutter pub run build_runner build

这将生成 $FloorAppDatabase 等必要的类,这些类将用于数据库操作。

总结

以上代码展示了如何使用 floor 插件在 Flutter 项目中进行数据库访问。虽然 floor_common 不是直接引用的库,但 floor 插件本身已经包含了所有必要的通用类型和工具,使得数据库操作变得简单和类型安全。

回到顶部