摘要:
floor 是为flutter app 提供一个简单的sqlite 抽象库.可以通过操作内存类,映射到数据库表,使得数据库的操作更加简单方便.floor 在提供简单的数据库操作的同时,也暴露出数据库对象,方便用户直接使用sql 进行sqlite 相关操作.
一.使用流程
1.首先创建一个entity ,用@entity 标记, floor_generator 会为当前的对象在数据库生成对应的表,如何生成等会儿会详细说.
2.定义DAO 对象(数据访问对象 Data Access Object),用@dao注解标记.这个用来管理sqlite数据库的访问.最好做到entity一一对应的.(那么可以不吗?DAO与entity 是啥关系呢)
3.创建数据库入库,用@Database 进行标记,参数版本号必须填,这是预留给未来数据库升级用的.entities 里面加入需要创建的表.当然也可以向数据库添加视图views. DepartmentDao get departmentDao 是啥就需要看看,为啥这么用要看看 database.g.dart 了.
4.在使用数据库的时候,需要根据一个生成方法.这个方法会根据数据库名去查询,如果数据存下直接打开,否则会创建相关数据库.
5.接下来就是数据库的使用,数据返回的是Future 函数可以直接用异步async /await 去处理.当然也有stream 的方式,那就需要进行订阅处理了.其实差不多,没啥影响.
二.floor 的内部访问逻辑
每一个entity 会生成一个数据库表,DAO 进行数据库表与内存 entity 进行关联映射.
DAO 进行数据库的增删改查操作.
DAO 生成类本质上只是数据的访问管理接口对象.它持有database 对象,然后根据相关注解,生成相应的Adapter 对象.比如如果当前DAO 又@indert 注解,就会生成InsertionAdapter 对象用来进行数据库的插入操作,否则就不会生成.如下:
那么就可以回答之前的问题:entity 与Dao 的关系? 其实DAO 就是为entity 生成相关的数据库action 函数.一个entity 可以对应多dao (只是没啥必要而已,最好相关操作放在一起)如下:
注意: 所有的这些生成函数都要添加到数据库构建函数里面才能进行代码生成,否则执行build 函数是不会生成的.
三.entity 相关语法数据库升级细节访问
https://gitee.com/TheKingGo/floor#ignoring-fields
参考文档:
1.https://github.com/vitusortner/floor/tree/develop/docs // 源码以及文档
2.https://gitee.com/TheKingGo/floor#ignoring-fields // 使用文档
3.https://www.sqlite.org/faq.html#q6 // sqlite 一些问答
4.https://developer.android.com/training/data-storage/room/async-queries //room文档
5.https://juejin.cn/post/6844903878392053774 // builder 相关文档