flutter floor数据库框架使用

Flutter floor数据库框架使用

集成方法

dependencies:
   flutter:
     sdk: flutter
   floor: ^1.2.0 #数据库

dev_dependencies:
  flutter_test:
    sdk: flutter

  floor_generator: ^1.2.0
  build_runner: ^2.1.2

创建实体

@entity 标记这一个类是对应一个数据库表。
@primaryKey 用于标记这是数据表的主键

@Entity(tableName: "areas") //表名
class AreaResponseAreaList {
	@primaryKey
	int? id;
	String? name;
	String? code;
	int? priceFlag;
	String? pinyin;
}

创建Dao

@dao
abstract class AreaResponseAreaListDao {
  @Query('SELECT * FROM areas')
  Future<List<AreaResponseAreaList>> findAllPersons();

  @Query('SELECT * FROM areas WHERE id = :id')
  Stream<AreaResponseAreaList?> findPersonById(int id);

  @insert
  Future<void> insertAreas(List<AreaResponseAreaList> areaList);
}

创建数据库

文件名 AppDataBase.dart 需要与 part ‘AppDataBase.g.dart’ 中文件名保持一致,不然导致自动生成文件失败

import 'dart:async';

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

@Database(version: 1, entities: [AreaResponseAreaList])
abstract class AppDataBase extends FloorDatabase {
  AreaResponseAreaListDao get areaResponseAreaListDao;
}

运行以下命令 flutter packages pub run build_runner build 自动生成文件,
如果需要在文件变动时,自动重新生成使用 flutter packages pub run build_runner watch
执行命令后生成 AppDataBase.g.dart 文件

使用生成的代码

包含创建、打开数据库,及dao生成的数据库操作代码

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'AppDataBase.dart';

// **************************************************************************
// FloorGenerator
// **************************************************************************

// ignore: avoid_classes_with_only_static_members
class $FloorAppDataBase {
  /// Creates a database builder for a persistent database.
  /// Once a database is built, you should keep a reference to it and re-use it.
  static _$AppDataBaseBuilder databaseBuilder(String name) =>
      _$AppDataBaseBuilder(name);

  /// Creates a database builder for an in memory database.
  /// Information stored in an in memory database disappears when the process is killed.
  /// Once a database is built, you should keep a reference to it and re-use it.
  static _$AppDataBaseBuilder inMemoryDatabaseBuilder() =>
      _$AppDataBaseBuilder(null);
}

class _$AppDataBaseBuilder {
  _$AppDataBaseBuilder(this.name);

  final String? name;

  final List<Migration> _migrations = [];

  Callback? _callback;

  /// Adds migrations to the builder.
  _$AppDataBaseBuilder addMigrations(List<Migration> migrations) {
    _migrations.addAll(migrations);
    return this;
  }

  /// Adds a database [Callback] to the builder.
  _$AppDataBaseBuilder addCallback(Callback callback) {
    _callback = callback;
    return this;
  }

  /// Creates the database and initializes it.
  Future<AppDataBase> build() async {
    final path = name != null
        ? await sqfliteDatabaseFactory.getDatabasePath(name!)
        : ':memory:';
    final database = _$AppDataBase();
    database.database = await database.open(
      path,
      _migrations,
      _callback,
    );
    return database;
  }
}

class _$AppDataBase extends AppDataBase {
  _$AppDataBase([StreamController<String>? listener]) {
    changeListener = listener ?? StreamController<String>.broadcast();
  }

  AreaResponseAreaListDao? _areaResponseAreaListDaoInstance;

  Future<sqflite.Database> open(String path, List<Migration> migrations,
      [Callback? callback]) async {
    final databaseOptions = sqflite.OpenDatabaseOptions(
      version: 1,
      onConfigure: (database) async {
        await database.execute('PRAGMA foreign_keys = ON');
        await callback?.onConfigure?.call(database);
      },
      onOpen: (database) async {
        await callback?.onOpen?.call(database);
      },
      onUpgrade: (database, startVersion, endVersion) async {
        await MigrationAdapter.runMigrations(
            database, startVersion, endVersion, migrations);

        await callback?.onUpgrade?.call(database, startVersion, endVersion);
      },
      onCreate: (database, version) async {
        await database.execute(
            'CREATE TABLE IF NOT EXISTS `areas` (`id` INTEGER, `name` TEXT, `code` TEXT, `priceFlag` INTEGER, `pinyin` TEXT, PRIMARY KEY (`id`))');

        await callback?.onCreate?.call(database, version);
      },
    );
    return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
  }

  @override
  AreaResponseAreaListDao get areaResponseAreaListDao {
    return _areaResponseAreaListDaoInstance ??=
        _$AreaResponseAreaListDao(database, changeListener);
  }
}

class _$AreaResponseAreaListDao extends AreaResponseAreaListDao {
  _$AreaResponseAreaListDao(this.database, this.changeListener)
      : _queryAdapter = QueryAdapter(database, changeListener),
        _areaResponseAreaListInsertionAdapter = InsertionAdapter(
            database,
            'areas',
            (AreaResponseAreaList item) => <String, Object?>{
                  'id': item.id,
                  'name': item.name,
                  'code': item.code,
                  'priceFlag': item.priceFlag,
                  'pinyin': item.pinyin
                },
            changeListener);

  final sqflite.DatabaseExecutor database;

  final StreamController<String> changeListener;

  final QueryAdapter _queryAdapter;

  final InsertionAdapter<AreaResponseAreaList>
      _areaResponseAreaListInsertionAdapter;

  @override
  Future<List<AreaResponseAreaList>> findAllPersons() async {
    return _queryAdapter.queryList('SELECT * FROM areas',
        mapper: (Map<String, Object?> row) => AreaResponseAreaList());
  }

  @override
  Stream<AreaResponseAreaList?> findPersonById(int id) {
    return _queryAdapter.queryStream('SELECT * FROM areas WHERE id = ?1',
        mapper: (Map<String, Object?> row) => AreaResponseAreaList(),
        arguments: [id],
        queryableName: 'areas',
        isView: false);
  }

  @override
  Future<void> insertAreas(List<AreaResponseAreaList> areaList) async {
    await _areaResponseAreaListInsertionAdapter.insertList(
        areaList, OnConflictStrategy.abort);
  }
}

使用生成的 F l o o r A p p D a t a b a s e 类 , 它 允 许 访 问 数 据 库 构 建 器 。 该 名 称 由 FloorAppDatabase类,它允许访问数据库构建器。该名称由 FloorAppDatabase,访Floor和数据库类名组成

传递给databaseBuilder()的字符串将是数据库文件名。

要初始化数据库,请调用build()并使用await确保结果。
根据数据库database获取到Dao就可以操作数据库了

  final String DB_NAME="Pad7_lxx";
  late final AppDataBase database;
  init() async {
    database = await $FloorAppDataBase
        .databaseBuilder(DB_NAME)
        .build();
    database.areaResponseAreaListDao.findPersonById(id);
  }

插入更新删除操作

插入@insert

// 单个插入
@insert
Future<void> insertAreas(AreaResponseAreaList area);

//插入多个
@insert
Future<void> insertAreas(List<AreaResponseAreaList> areaList);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值