Flutter ORM数据库介绍

Flutter现在开发上最大的槽点可能就是数据库使用了,Flutter现在只提供了sqflite插件,这表明开发者手动写sql代码,建表、建索引、transation、db线程控制等等繁琐的事情必然接踵而至,这种数据库使用方式是最低效的了。例如IOS平台有coredata、realm等等的框架提供便捷的数据库操作,但来到flutter就又倒退回去裸写sql,这对大部分团队都是重大的成本。

本文将详细介绍一种在Flutter项目中优雅的使用ORM数据库的方法,我们使用的ORM框架是包含在一个Flutter插件flutter_luakit_plugin(如何使用可参考介绍文章)中的其中一个功能,本文只详细介绍这套ORM框架的使用和实现原理。我们给出了一个demo。

我们demo中实现了一个简单的功能,从一个天气网站上查询北京的天气信息,解析返回的json然后存数据库,下次启动优先从数据库查数据马上显示,再发请求向天气网站更新天气信息,就这么简单的一个功能。虽然功能简单,但是我们99%日常的业务逻辑也就是由这些简单的逻辑组成的了。下面是demo运行的效果图。

image

看完运行效果,我们开始看看ORM数据库的使用。ORM数据库的核心代码都是lua,其中WeatherManager.lua是业务逻辑代码,其他的lua文件是ORM数据库的核心代码,全部是lua实现的,所有代码文件加起来也就120k左右,非常轻量。

针对上面提到的天气信息的功能,我们来设计数据模型,从demo的展示我们看到每天天气信息包含几个信息,城市名、日出日落时间、最高温度、最低温度、风向、风力,然后为了区分是哪一天的数据,我们给每条信息加上个id的属性,作为主键。想好我们就开始定义第一个ORM数据模型,有几个必要的信息,db名,表名,后面的就是我们需要的各个字段了,我们提供IntegerField、RealField、BlobField、TextField、BooleandField。等常用的数据类型。weather 就是这个模型的名字,之后我们weather为索引使用这个数据模型。定义模型代码如下。

weather = {

__dbname__ = "test.db",

__tablename__ = "weather",

id = {"IntegerField",{unique = true, null = false, primary_key = true}},

wind = {"TextField",{}},

wind_direction = {"TextField",{}},

sun_info = {"TextField",{}},

low = {"IntegerField",{}},

high = {"IntegerField",{}},

city = {"TextField",{}},

},

定义好模型后,我们看看如何使用,我们跟着业务逻辑走,首先网络请求回来我们要生成模型对象存到数据库,分下面几步

获取模型对象

local Table = require('orm.class.table')

local _weatherTable = Table("weather”)

准备数据,建立数据对象

local t = {}

t.wind = flDict[v.fg]

t.wind_direction = fxDict[v.ff]

t.sun_info = v.fi

t.low = tonumber(v.fd)

t.high = tonumber(v.fc)

t.id = i

t.city = city

local weather = _weatherTable(t)

保存数据

weather:save()

读取数据

_weatherTable.get:all():getPureData()

是不是很简单,很优雅,什么建表、拼sql、transation、线程安全等等都不用考虑,傻瓜式地使用,一个业务就几行代码搞定。这里只演示了简单的存取,更多的select、update、联表等高级用法可参考db_test demo。

Flutter ORM数据库原理详解

好了,上面已经介绍完如何使用了,如果大家仅仅关心使用下面的可以不看了,如果大家想了解这套跨平台的ORM框架的实现原理,下面就会详细介绍,其实了解了实现原理,对大家具体业务使用还是很有好处的,虽然我感觉大家用的时候极少了解原理。

我们把orm框架分为三层接入层,cache层,db操作层,三个层分别处于对应的线程,具体可以参考下图。接入层可以在任意线程发起,接入层也是每次数据库操作的发起点,上面的demo所有操作都是在接入层,cache层,db操作层仅仅是ORM内部划分,对使用者来讲不需要关心cache层和db操作层。我们把所有的操作分成两种,db后续相关的,和db后续无关的。

image

db后续无关的操作是从接入层不同的线程进入到cache层的队列,所有操作在这个队列里先同步完成内存操作,然后即可马上返回接入层,异步再到db操作层进行db操作。db后续无关的操作包括 save、update、delete。

db后续相关的操作依赖db操作层操作的结果,这样的话就必须等真实的db操作完成了再返回接入层。db后续相关的操作包括select。

要做到这种数据同步,我们必须先把orm操作接口抽象化,只给几个常用的接口,所有操作都必须通过指定的接口来完成。我们总结了如下基本操作接口。

1、save

2、select where

3、select PrimaryKey

4、update where

5、update PrimaryKey

6、delete where

7、delete PrimaryKey

这七种操作只要在操作前返回前对内存中的cache做相应的处理,即可保证内存cache始终和db保持一致,这样以后我们就可以优先使用cache层的数据了。这七种操作的实现逻辑,这里先说明一下,cache里面的对象都是以主键为key,orm对象为value的形式存储在内存中的,这些控制逻辑是写在cache.lua里面的。

下面详细介绍七种基本操作的逻辑。

save操作,同步修改内存cache,然后马上返回接入层,再异步进行db replace into 的操作

image

where条件select,这个必须先同步到db线程获取查询结果,再同步修改内存里面的cache值,再返回给接入层

image

select PrimaryKey,就是选一定PrimaryKey值的orm对象,这个操作首先看cache里面是否有primarykey 值的orm对,如果有,直接返回,如果没有,先同步到db线程获取查询结果,再同步修改内存里面的cache值,再返回给接入层

image

update where,先同步到db线程通过where 条件select出需要update的主键值,根据主键值和需要update的内容,同步更新内存cache,然后异步进行db的update操作

image

update PrimaryKey,根据PrimaryKey进行update操作,先同步更新内存cache,然后异步进行db的update操作

image

delete where,先同步到db线程通过where 条件select出需要delete的主键值,根据主键值删除内存cache,然后异步进行db的delete操作

image

delete PrimaryKey,根据PrimaryKey进行delete操作,先同步删除内存cache,然后异步进行db的delete操作

image

只要保证上面七种基本操作逻辑,即可保证cache中的内容和db最终的内容是一致的,这种尽量使用cache的特性可以提升数据库操作的效率,而且保证同一个db的所有操作都在指定的cache线程和db线程里面完成,也可以保证线程安全。

最后,由于我们所有的db操作都集中起来了,我们可以定时的transation 保存,这样可以大幅提升数据库操作的性能。

结语

目前Flutter领域最大的痛点就是数据库操作,本文提供了一种优雅使用ORM数据库的方法,大幅降低了使用数据库的门槛。希望这篇文章和flutter_luakit_plugin可以帮到大家更方便的开发Flutter

应用。

flutter如何访问mysql数据库_手把手教你在Flutter项目优雅的使用ORM数据库相关推荐

  1. jsp mysql视频_手把手教你做jsp servlet mysql实现的图书管理系统附带视频开发教程和完整源码...

    上一个教程我们做的是对数据库框架底层原理的讲解,然后教大家做了一个自己的数据库框架,这次我们做的这个图书管理系统就是用我们上个教程自己写的数据库框架,整个项目做完框架运行的很稳定,没有出现任何问题.如 ...

  2. mysql中括号_手把手教你看MySQL官方文档

    前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...

  3. sinaapp mysql连接_手把手教你在新浪云上免费部署自己的网站--连接数据库

    看完之后,默认你知道怎么将代码上传到新浪云SAE,并且能够成功运行,连接数据库之前,你必须先创建有一个应用. 现在我创建一个名称为sampleone的应用,如下图 点击左侧的代码管理,选在右侧创建一个 ...

  4. ueditor上传图片写入数据库_手把手教你,如何用交管12123上传驾驶证照片!

    12123APP普及后 方便了很多司机朋友 足不出户就能办理交管业务 然而 交管业务网上办理过程中 因为一些小问题的存在 导致业务受理受阻 例如: 司机朋友在使用"交管12123" ...

  5. knex mysql 操作_手把手教你用express + mysql + knex 做个 todoList

    成果展示 启动mysql,用knex连接数据 接口功能拆分 建表:创建任务列表 查询任务列表 添加任务 删除任务 修改任务内容 把任务设为已完成/恢复任务为未完成 前端展示:vue+bootstrap ...

  6. zblog mysql修改_手把手教修正zblog默认阅读量

    最后提示两点,在修改之前对数据库进行备份,修改当前文件重建,详细的效果须要在你修改以后发表的文章中才干够看到. 良多个人博客的流量较低,导致博客文章的拜访量跟浏览量有限.那么有不措施可以像织梦那样手动 ...

  7. 无法访问netflix服务_手把手教你申请Netflix退款

    相信大家对Netflix都不陌生,Netflix(Nasdaq NFLX) 成立于1997年,是一家在线影片租赁提供商,主要提供Netflix超大数量的DVD并免费递送,总部位于美国加利福尼亚州洛斯盖 ...

  8. 引入yml依赖包_手把手教你发布 Python 项目开源包

    编译:机器之心,作者:Gabriel Lerner.Nathan Toubiana 好不容易码了个 python 项目,是不是很兴奋?那么怎么把这个项目发出去让大家看到呢?本文作者写了一份在 GitH ...

  9. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

最新文章

  1. uva10954 - Add All(multiset功能)
  2. g4e基础篇#5 创建分支和保存代码
  3. C++11 学习笔记 lambda表达式
  4. (二)oracle的SGA
  5. stm32中.bss和.data段是在哪里初始化的
  6. Div 高度、滚动条距 Div 顶部偏移量、Div 中文档总高度
  7. hadoop jar 找不到main class_10年老架构,教你HadoopJob使用第三方依赖jar文件,不来就后悔吧...
  8. vant实现三级联动
  9. Quartus II 软件使用(零)---安装与破解 (9.0版本 亲测有效)
  10. CardView-卡片布局
  11. [学习IMU](MEMS 三轴加速计、三轴陀螺仪、三轴磁力计)6轴IMU+磁力计,9轴传感器讲解
  12. 如何打造高质量的网页内容呢?
  13. 网易云/QQ音乐歌单转移到Apple Music内
  14. Windows10下安装Gromacs2020
  15. 高博课程编程作业之计算小萝卜的坐标
  16. 计算机网络电缆不可用,解决方案:插入互联网电缆后,计算机无法连接到互联网...
  17. 重装系统服务器2012r2,SCCM2012R2网络部署重装系统
  18. 运用Ntop监控网络流量(视频Demo)
  19. PTA 校选拔 7-10 宇航员的寻宝图(BFS)
  20. xp系统服务器的ip地址怎么查,xp怎么配置ip地址|xp系统怎么样查看自己的ip地址...

热门文章

  1. oracle 连不上 显示socket read time out
  2. eureka注册中心启动后访问,控制台出现socket read timeout exception
  3. SystemVerilog学习总结
  4. 【英语学习】十二星座Zodiac Signs的词源/词根/示例
  5. 将网页内容截屏的好工具
  6. computehash在php怎么实现,卓象程序员:PHP实现基础区块链
  7. Cadence设计原理图常用导出方案
  8. nohost.php,NOCOSTWebHost :1G可绑米免费PHP空间
  9. RTX2080ti显卡+win10+安装Tensorflow-gpu
  10. Android手机号码获取问题