Flutter本地数据库SQLite的ORM工具floor使用

在这里插入图片描述

引言

Flutter本地持久化存储数据库SQLite,使用不够便捷,特别升级迁移时。插件floor是一个数据库orm工具,让我们可以轻松愉快的使用数据库,基本满足日常使用,让我们一起看看如何使用以及会有哪些坑。

插件floor

  • Likes–583
  • Pub points–120
  • Popularity–98%
  • Platform–android,iOS,macos
  • last version–1.3.0
  • 数据采集日期202210

准备

pubspec.yaml添加以下依赖,floor_generator和build_runner是协助生成数据库代码,命令是flutter packages pub run build_runner build,生成后如果有改动则用flutter packages pub run build_runner watch,让生成的代码保持最新。

dependencies:
  floor: ^1.3.0  # SQLite工具

dev_dependencies:
  floor_generator: ^1.3.0
  build_runner: ^2.1.2

在项目中本地数据库SQLite相关文件一般不会调整太大,在实战中习惯单独建立一个文件夹管理,自定义数据库工具类来管理这个数据库,可以建立数据库管理目录,建立DBUtil类来管理数据库,目录结构如下图:

类绑定表

SQLite支持的字段类型有,如果有时间DateTime或枚举类等需要转换成数据库可使用的类型,示例中用枚举来转成数据库可用的整型,在库表里存的是整型int,解析后实体类是枚举类,同样如果是时间DateTime类型,可以用millisecondsSinceEpoch(整型表示时间)来互相转换。


class PhoneBean {
  
  int? id;
  String? brand; //品牌
  String? model; //型号
  double? price; //单价
  SystemType os; //操作系统

  PhoneBean({
    this.id,
    this.brand,
    this.model,
    this.price,
    this.os = SystemType.android,
  });
}
enum SystemType {
  android('安卓'),
  windows('微软'),
  ios('苹果');
  final String name;//需要dart 2.18.1以上
  const SystemType(this.name);
}

DAO类

Data Access Object是指数据访问对象,直白一点就是负责代码中类与数据库表之间的增删改查操作,这里定义了最基本的一些方法,floor已经将常用的操作处理好,直接可以用,非常方便,如果需要特定的操作可以手写SQL。这里返回可以是Future也可以是Stream类型的,支持批量操作,如果需要插入多个phones数据到表里,insertPhones(List phones),详见下图底部的多行注释内容。

import 'package:floor/floor.dart';

abstract class PhoneDao {
  //增
  ()
  Future<void> insertPhone(PhoneBean phone);
  //删
  
  Future<void> deletePhone(PhoneBean phone);
  //改
  
  Future<void> updatePhone(PhoneBean phone);
  //查
  ('SELECT * FROM PhoneBean')
  Future<List<PhoneBean>?> findAllPhones();
  /*
  Future<void> insertPhones(List<PhoneBean> phones);
  */
}

数据库抽象类

在这个类里原本需要我们告诉floor插件,表对应的实体类是:entities: [PhoneBean],数据库当前版本version: 2,这个是每次修改表结构需要升级一下版本,不至于数据库不认识之前的表或找不到对应的表Column,还有就是需要转换的类@TypeConverters([SystemTypeConverter]),floor提供TypeConverter<T, K>,转换类SystemTypeConverter继承他就可以。

//文件名 app_database.dart,生成代码文件app_database.g.dart
(version: 2, entities: [PhoneBean])
([SystemTypeConverter])
abstract class AppDatabase extends FloorDatabase {
  PhoneDao get daoPhone;
}
//枚举互转整型
class SystemTypeConverter extends TypeConverter<SystemType, int> {
  
  SystemType decode(int databaseValue) {
    return SystemType.values[databaseValue];
  }

  
  int encode(SystemType value) {
    return value.index;
  }
}

生成代码

在终端执行

flutter packages pub run build_runner build

生成代码后文件位置如图

将生成的文件改为dart后缀,根据数据库抽象类的文件改成:app_database.g.dart,放在db文件夹里,并在app_database.dart文件里导入库

import 'dart:async';//新生成的文件需要

import 'package:floor/floor.dart';
import 'package:sqflite/sqflite.dart' as sqflite;//新生成的文件需要

import '/view/db_util/common/system_type_converter.dart';
import '/view/db_util/dao/phone_dao.dart';
import '../bean/phone_bean.dart';

part 'app_database.g.dart';
//在app_database.g.dart文件里,使其变成app_database.dart文件的一部分
part of 'app_database.dart';

数据库工具类

在项目中将数据库相关的封装成工具类,是单例形式,可以在某些模块中使用完后销毁,需要用时再初始化即可,主要是调用Dao类的方法。

//
class DBUtil {
  //单例
  static  DBUtil? _singleton ;
  factory DBUtil() => _singleton??=DBUtil._();
  void dispose()=>_singleton=null;
  //定义数据库变量
  late final AppDatabase _db;
  PhoneDao get daoPhone => _db.daoPhone;
  initDB() async {
    _db = await $FloorAppDatabase.databaseBuilder('app_database.db').addMigrations(
      [migration1to2],
    ).build();
  }

  //迁移策略,数据库版本1->2
  final migration1to2 = Migration(1, 2, (database) async {
    await database.execute('ALTER TABLE PhoneBean ADD COLUMN os INTEGER');
  });
}

数据库工具使用

数据库工具类DBUtil是单例,由于数据库生成或打开需要异步操作,将初始化内容单独放在initDB方法里,在使用数据库工具类之前先进行初始化await DBUtil().initDB();之后就可以直接调用Dao类来操作表和实体类。

//需要先初始化
await DBUtil().initDB();
//获取所有表数据,具体看DAO类里定义的方法
phoneList = await DBUtil().daoPhone.findAllPhones() ?? [];

数据库迁移

在使用floor后迁移变得简单明了,修改后一般是删除自动生成的代码文件app_database.g.dart,再次在终端执行flutter packages pub run build_runner build就完成。

//在app_database.dart文件里的版本号从1改为2
(version: 2, entities: [PhoneBean])
//db_util.dart的类DBUtil初始化修改一下,再加个迁移策略即可
initDB() async {
  _db = await $FloorAppDatabase.databaseBuilder('app_database.db').addMigrations(
    [migration1to2],
  ).build();
}
//迁移策略,数据库版本1->2
final migration1to2 = Migration(1, 2, (database) async {
  await database.execute('ALTER TABLE PhoneBean ADD COLUMN os INTEGER');
});
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Flutter是一种跨平台的移动应用程序开发框架,它提供了使用SQLite数据库的内置支持。 要使用SQLite数据库,您需要使用Fluttersqlite包。您可以通过在pubspec.yaml文件中添加以下依赖项来获取此包: ```yaml dependencies: sqflite: ^2.0.0+3 ``` 一旦您添加了依赖项并运行了`flutter packages get`,您就可以开始使用SQLite数据库了。以下是如何使用SQLite数据库的一些示例: ### 创建数据库 ```dart import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; final database = openDatabase( join(await getDatabasesPath(), 'my_database.db'), onCreate: (db, version) { return db.execute( 'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)', ); }, version: 1, ); ``` 在这个示例中,我们创建了一个名为`my_database.db`的数据库,并在其中创建了一个名为“users”的表。 ### 插入数据 ```dart await database.insert( 'users', {'id': 1, 'name': 'John', 'age': 30}, ); ``` 在这个示例中,我们向“users”表中插入了一条数据。 ### 查询数据 ```dart final List<Map<String, dynamic>> users = await database.query('users'); ``` 在这个示例中,我们查询了“users”表中的所有数据。 ### 更新数据 ```dart await database.update( 'users', {'age': 31}, where: 'name = ?', whereArgs: ['John'], ); ``` 在这个示例中,我们将“users”表中名为“John”的用户的年龄更新为31岁。 ### 删除数据 ```dart await database.delete( 'users', where: 'name = ?', whereArgs: ['John'], ); ``` 在这个示例中,我们删除了“users”表中名为“John”的用户的记录。 这是使用FlutterSQLite数据库的一些基本示例。您可以使用这些示例来开始使用SQLite数据库,并根据您的需求进行修改。 ### 回答2: 在Flutter中,可以使用sqflite插件来实现对SQLite数据库的增删改查操作。 首先,需要在pubspec.yaml文件中添加sqflite插件的依赖: ``` dependencies: sqflite: ^x.x.x ``` 然后,在需要使用SQLite数据库的地方引入sqflite库: ``` import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; ``` 接下来,创建一个数据库的帮助类,用于管理数据库的创建和版本更新。可以创建一个名为DatabaseHelper的类,并在其内部提供一些静态方法。 ``` class DatabaseHelper { static Future<Database> database() async { String path = join(await getDatabasesPath(), 'database.db'); return await openDatabase(path, version: 1, onCreate: _createTable); } static Future<void> _createTable(Database db, int version) async { await db.execute('CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)'); } } ``` 在这个类中,我们定义了一个数据库方法,该方法通过getDatabasesPath()获取数据库的路径,并将其与数据库名称拼接在一起以获取完整路径。然后,我们通过openDatabase()方法打开数据库,如果数据库不存在,则创建数据库,并在数据库中创建名为users的表。 然后,可以在其他地方使用这个DatabaseHelper类,执行增删改查的操作。 ``` class UserRepository { static Future<void> addUser(String name) async { Database db = await DatabaseHelper.database(); await db.insert('users', {'name': name}); } static Future<void> deleteUser(int id) async { Database db = await DatabaseHelper.database(); await db.delete('users', where: 'id = ?', whereArgs: [id]); } static Future<void> updateUser(int id, String name) async { Database db = await DatabaseHelper.database(); await db.update('users', {'name': name}, where: 'id = ?', whereArgs: [id]); } static Future<List<Map<String, dynamic>>> getUsers() async { Database db = await DatabaseHelper.database(); return await db.query('users'); } } ``` 在这个示例中,我们通过addUser()方法向数据库中的users表中插入一条数据,通过deleteUser()方法根据id来删除数据,通过updateUser()方法根据id来更新数据,通过getUsers()方法获取所有的用户数据。 以上就是使用sqflite插件在Flutter使用SQLite数据库实现增删改查的基本步骤。要注意的是,在实际使用中,还需要处理数据库的异常情况和事务处理。 ### 回答3: 使用Flutter操作SQLite数据库的步骤如下: 1. 导入相关依赖:在pubspec.yaml文件中添加sqflite和path两个依赖。 ``` dependencies: flutter: sdk: flutter sqflite: ^2.0.0 path: ^2.0.0 ``` 2. 创建数据库:在Flutter中,可以使用openDatabase函数创建一个SQLite数据库。 ```dart import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; final String tableName = 'person'; // 表名 Future<Database> database() async { return openDatabase( join(await getDatabasesPath(), 'database.db'), // 数据库名 onCreate: (db, version) { return db.execute( 'CREATE TABLE $tableName(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)', ); // 创建表 }, version: 1, // 数据库版本号 ); } ``` 3. 插入数据:使用insert函数将数据插入到数据库中。 ```dart Future<void> insertPerson(Person person) async { final db = await database(); await db.insert( tableName, person.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, // 冲突处理策略 ); } ``` 4. 查询数据:使用query函数从数据库中查询数据。 ```dart Future<List<Map<String, dynamic>>> queryAllPersons() async { final db = await database(); return db.query(tableName); } ``` 5. 更新数据:使用update函数更新数据库中的数据。 ```dart Future<void> updatePerson(Person person) async { final db = await database(); await db.update( tableName, person.toMap(), where: 'id = ?', whereArgs: [person.id], // 条件参数,保证更新正确的记录 ); } ``` 6. 删除数据:使用delete函数删除数据库中的数据。 ```dart Future<void> deletePerson(int id) async { final db = await database(); await db.delete( tableName, where: 'id = ?', whereArgs: [id], // 条件参数,保证删除正确的记录 ); } ``` 以上就是在Flutter使用SQLite数据库实现增删改查的基本步骤。有了这些操作,你可以方便地处理数据库数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值