我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flutter怎么用ORM框架简化本地数据库管理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flutter怎么用ORM框架简化本地数据库管理

这篇“Flutter怎么用ORM框架简化本地数据库管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter怎么用ORM框架简化本地数据库管理”文章吧。

floor 简介

floor 是基于 sqflite 的一个轻量级的 ORM 框架,通过注解和代码生成可以将数据库数据直接映射为实体类对象。floor 内置了很多操作数据库的方法,比如增删改查,让我们快速接入数据库。同时,也可以在注解中编写 SQL来实现复杂的数据库查询,比如 IN 查询、数据统计等等。通过注解和代码生成能够减少大量手写代码,提高我们的开发效率和代码的可维护性。 floor 需要引入的开发依赖如下,都是用于基于注解生成代码。

dev_dependencies:    flutter_test:        sdk: flutter    # ...    floor_generator: ^1.4.1    build_runner: ^2.3.3

接下来我们就以之前的备忘录为例,来看看使用 floor 后的改善。

ORM 映射

我们之前的备忘录类 Memo 需要自己编写 fromJsontoJson 方法来实现数据库数据到实体类对象的转换。此外,遇到 SQLite 不支持的数据类型(如 DateTimeList<String>)时,还需要处理转换代码。我们来看 floor 如何处理。 floor 将数据库操作分为实体类和 DAO,实体类与数据库的映射通过注解完成。例如我们的 Memo 类,调整后的代码如下所示。

@entityclass Memo {  @PrimaryKey(autoGenerate: true)  final int? id;  String title;  String content;  @ColumnInfo(name: 'created_time')  DateTime createdTime;  @ColumnInfo(name: 'modified_time')  DateTime modifiedTime;  List<String> tags;  Memo({    this.id,    required this.title,    required this.content,    required this.createdTime,    required this.modifiedTime,    required this.tags,  });}

这里说明一下常见的注解:

  • @entity:表示这是一个实体类,会和数据库的某个数据表映射,默认表名就是类名。如果要手动指定表名,可以使用@Entity(tableName: tableName)通过 tableName 指定数据表名称。floor 会自动根据@entity 注解生成创建数据表的 SQL 语句。

  • @primaryKey:表示字段为主键,如果需要使用自增主键,可以使用@PrimaryKey(autoGenerate: true)

  • @ColumnInfo(name: name):设置实体类成员属性和数据表字段的映射关系,默认 floor 使用的数据表字段名称和类成员属性名称一致,如果需要指定数据表字段名,就可以使用这个注解。

  • @ignore:忽略某个成员属性,即该属性不产生相应的数据表字段。注意,通过 get 方法产生的计算属性默认就会被忽略,例如长方形面积 double get area => width * height

DAO 用于从数据库查询数据并转换为实体类对象,从数据库查询数据和转换的代码通过注解直接生成。DAO 提供了基础的插入、更新和删除方法,这些方法可以通过注解@insert@update @delete完成,不需要编写 SQL。 同时,对于插入和更新可以设置冲突策略,策略可以是中止(abort)、回滚(rollback)、替换(replace)、忽略(ignore)、失败(fail)。其中除了替换以外,其他都是和数据库事务有关。

@daoabstract class MemoDao {  @Query('SELECT * FROM Memo ORDER BY modified_time DESC')  Future<List<Memo>> findAllMemos();  @Query(      'SELECT * FROM Memo WHERE title LIKE :searchKey OR content LIKE :searchKey ORDER BY modified_time DESC')  Future<List<Memo>> findMemoWithSearchKey(String searchKey);  @Query('SELECT * FROM Memo WHERE id = :id')  Stream<Memo?> findMemoById(int id);  @insert  Future<void> insertMemo(Memo memo);  @Update(onConflict: OnConflictStrategy.replace)  Future<void> updateMemo(Memo memo);  @delete  Future<void> deleteMemo(Memo memo);}

转换器

使用 floor 可以统一 Dart 数据类型到 SQLite 字段的转换方式。通过定义不同的类型转换器TypeConverter实现数据库和Dart 数据类型的转换,从而避免了每个实体类都要单独编写转换代码。比如我们在备忘录用到了两个类型 DateTimeList<String> 就定义了对应的转换器。

class StringListConverter extends TypeConverter<List<String>, String> {  @override  List<String> decode(String databaseValue) {    return databaseValue.isNotEmpty ? databaseValue.split('|') : [];  }  @override  String encode(List<String> value) {    return value.join('|');  }}class DateTimeConverter extends TypeConverter<DateTime, int> {  @override  DateTime decode(int databaseValue) {    return DateTime.fromMillisecondsSinceEpoch(databaseValue);  }  @override  int encode(DateTime value) {    return value.millisecondsSinceEpoch;  }}

使用转换器只需要在定义数据库FloorDatabase 的抽象类的时候引入到注解@TypeConverters就可以了。

@TypeConverters([StringListConverter, DateTimeConverter])@Database(version: 1, entities: [Memo])abstract class MemoDatabase extends FloorDatabase {  MemoDao get memoDao;}

代码改造

通常来说 DAO 对象会在很多地方共用,适合使用单例方式来构造。这里我们在App启动的时候就使用 GetIt来实现MemoDao 的单例注册。

Future<void> main() async {  WidgetsFlutterBinding.ensureInitialized();  final database =      await $FloorMemoDatabase.databaseBuilder('app_database.db').build();  final dao = database.memoDao;  getIt.registerSingleton<MemoDao>(dao, signalsReady: true);  runApp(const MyApp());}

这里调用ensureInitialized这个方法是保证 Flutter 和原生交互的部分已经完成,因为在 sqflite 中需要使用原生的文件存储。 备忘录列表的代码改造涉及数据操作的有两处,分别是列表刷新和删除备忘录。列表模糊搜索时需要自己组装模糊搜索的字符,比如我们这里使用了百分号将搜索关键词包裹实现任意匹配。删除备忘录需要根据是否有搜索调用不同的方法,这是因为对应的 SQL 不同。

void _refreshMemoList({String? searchKey}) async {  List<Memo> memoList = searchKey == null      ? await GetIt.I<MemoDao>().findAllMemos()      : await GetIt.I<MemoDao>().findMemoWithSearchKey('%$searchKey%');  setState(() {    _memoList = memoList;  });}

删除就非常简单了,直接调用删除方法就好了。

void _deleteMemo(Memo memo) async {    final confirmed = await _showDeleteConfirmationDialog(memo);    if (confirmed != null && confirmed) {      await GetIt.I<MemoDao>().deleteMemo(memo);      _refreshMemoList();      if (!mounted) return;      ScaffoldMessenger.of(context).showSnackBar(SnackBar(        content: Text('已删除 "${memo.title}"'),        duration: const Duration(seconds: 2),      ));    }  }

添加备忘录的页面只需要更改保存备忘录的方法,而且因为不需要再对时间做转换,方法更为简洁。

Future<void> _saveMemo(BuildContext context) async {  var memo = Memo(      title: _title,      content: _content,      createdTime: DateTime.now(),      modifiedTime: DateTime.now(),      tags: _tags);  // 保存备忘录  await GetIt.I<MemoDao>().insertMemo(memo);}

编辑备忘录页面也类似,调用 updateMemo 方法即可完成保存。

Future<void> _saveMemo(BuildContext context) async {  widget.memo.title = _title;  widget.memo.content = _content;  widget.memo.modifiedTime = DateTime.now();  // 保存备忘录  await GetIt.I<MemoDao>().updateMemo(widget.memo);}

总结

代码已经提交到:本地存储相关代码,注意如果更改了 ORM 相关的类,需要运行下面的命令重新生成代码。

flutter packages pub run build_runner build

可以看到,通过 floor 这样的 ORM 框架可以让整个本地数据库管理的代码更为简洁,复用性更高。如果说是本地数据存储比较复杂的,推荐使用 ORM 框架来管理。

以上就是关于“Flutter怎么用ORM框架简化本地数据库管理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flutter怎么用ORM框架简化本地数据库管理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flutter怎么用ORM框架简化本地数据库管理

这篇“Flutter怎么用ORM框架简化本地数据库管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter怎么用OR
2023-07-05

Flutter利用ORM框架简化本地数据库管理详解

使用 sqflite 相对来说还是有点复杂,比如遇到数据不兼容的时候需要手动转换,增加了不少繁琐的代码。本篇我们就来介绍一个 ORM 框架,来简化数据库的管理,感兴趣的可以了解一下
2023-05-15

Flutter怎么用ORM框架管理数据库

本篇内容主要讲解“Flutter怎么用ORM框架管理数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flutter怎么用ORM框架管理数据库”吧!floor 数据库版本升级floor 框架同
2023-07-06

Flutter利用ORM框架管理数据库详解

使用 ORM 框架最大的好处是简化了数据库维护的代码量,使得我们可以专注于业务代码实现。本篇,我们看看如何使用ORM框架管理数据库版本迁移,需要的可以参考一下
2023-05-16

如何在Python中使用ORM框架操作MySQL数据库?(Python环境下如何通过ORM框架管理MySQL数据库?)

对象关系映射(ORM)框架简化了Python程序员与关系数据库(如MySQL)的交互,让他们专注于业务逻辑,无需管理SQL语句和数据库连接。适用于Python的流行ORM框架包括SQLAlchemy、DjangoORM、Peewee和PonyORM。通过这些框架,开发人员可以轻松插入、查询和更新MySQL数据库中的数据。ORM框架的优势包括提高开发效率、代码可维护性和安全性,并提供跨平台支持。
如何在Python中使用ORM框架操作MySQL数据库?(Python环境下如何通过ORM框架管理MySQL数据库?)
2024-04-02

PHP中怎么使用ORM框架连接数据库

这篇文章主要介绍“PHP中怎么使用ORM框架连接数据库”,在日常操作中,相信很多人在PHP中怎么使用ORM框架连接数据库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP中怎么使用ORM框架连接数据库”的疑
2023-07-06

Android Flutter怎么使用本地数据库编写备忘录应用

这篇“Android Flutter怎么使用本地数据库编写备忘录应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Andro
2023-07-05

PHP 数据库连接自动化:使用脚本和工具简化管理

php 提供了自动化数据库连接的解决方案,包括:使用 pdo 连接到不同 dbms 并执行查询和修改;使用脚本定期执行维护任务,如清理和优化;使用 phpmyadmin、doctrine dbal 等第三方工具简化管理;使用脚本和 pdo
PHP 数据库连接自动化:使用脚本和工具简化管理
2024-05-21

C++技术中的大数据处理:如何使用第三方库和框架简化大数据处理?

使用第三方库(如 apac++he hadoop 和 apache spark)以及框架在 c++ 中处理大数据变得更加容易,从而提高了开发效率、性能和可扩展性。具体来说:第三方库提供处理海量数据集的强大功能,例如 hadoop 和 spa
C++技术中的大数据处理:如何使用第三方库和框架简化大数据处理?
2024-05-11

云服务器访问本地数据库怎么设置权限管理

如果您要在云服务器上访问本地数据库,您需要为其设置访问权限管理。以下是云服务器访问本地数据库的示例代码:登录云服务器管理界面在本地登录您的云服务器管理界面,并点击“设置”按钮。添加访问控制列表在此处,您可以根据需要添加或移除访问控制列表,以控制您的云服务器上的资源访问权限。选择“允许访问的资源列表”在允许或禁止访问的资源列表中,选择您需要访问的具体资源的“允许访问的资源列表”选项。设置访问权限在此处,您可...
2023-10-27

云服务器访问本地数据库怎么设置权限管理密码

如果你想让云服务器访问本地数据库,你需要进行以下步骤来设置权限管理密码:首先,你需要在本地数据库中创建一个新的用户,并为该用户设置一个密码。你可以使用以下命令来创建一个新用户:CREATEUSER'newuser'@'%'IDENTIFIEDBY'password';这将创建一个名为“newuser”的新用户,并为该用户设置一个密码为“password”。接下来,你需要为该用户授予访问本地数据库的权限。你可以使用以下命令来授予权限:GR...
2023-10-27

云服务器怎么连接本地数据库的网络设备管理器

首先,我们需要确保您的云服务器是可用的,并且已经配置了必要的网络连接。在您选择云服务器提供商之前,您应该确保它们有可靠的技术支持,并且您已经选择了合适的服务器和网络连接配置。其次,在您连接到云服务器之前,您需要选择适当的本地数据库服务器,并确保它们与云服务器提供商的网络连接是兼容的。云服务器提供商通常会提供多种云服务器
2023-10-27

MySQL数据库安装方法与图形化管理工具怎么用

这篇文章主要介绍“MySQL数据库安装方法与图形化管理工具怎么用”,在日常操作中,相信很多人在MySQL数据库安装方法与图形化管理工具怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL数据库安装方
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录