原文首发于微信公众号:jzman-blog,欢迎关注交流!

DBFlow 是一个基于注解处理器开发的使用方便的 ORM Android 数据库,该库简化了很多多余的代码,并且提供了好用的 API 来处理与数据库的交互,让开发者专注 App 的开发。下面将从以下几个方面来学习 DBFlow 数据库框架的使用,具体如下:

1. DBFlow 的优势

2. 配置 DBFlow

3. 创建数据库

4. 创建表

5. 插入数据

6. 删除数据

7. 更新数据

8. 查询数据

9. 案例

DBFlow 的优势

DBFlow 借鉴了一些其他优秀数据库框架的特性,下面是 DBFlow 的优势,具体如下:

1. Extensibility(扩展性):对表类的继承类没有限制,可以是一个普通的 JavaBean,使用时为了方便推荐表类继承 BaseModel 类你可以扩展不同包中的非模型类,并将它们用作数据库表,此外,你可以将其他表的子类加入到 @Column 中,并且它们可以位于不同的包中。

2. Speed(速度):该库基于 Java 的注解处理器生成,使用它对运行时性能几乎没有任何影响(反射仅仅用于生数据库模块的生成),可以节省生成样板代码的时间,支持模型缓存(多主键模型),在可能的情况下比原生的 SQLite 速度要快,支持懒加载、@ForeignKey、@OneToMany等使得查询更有效率。

3. SQLite Query Flow(SQLite查询流):DBFlow 的查询尽可能的贴近原生 SQLite 查询,如:

select(name, screenSize).from(Android.class).where(name.is("Nexus 5x")).and(version.is(6.0)).querySingle()
  1. Open Source(开源):DBFlow 时开源的,开源地址:Github
  2. Robust(健壮性):支持 Trigger, ModelView, Index, Migration 以及内置的管理数据库的方式, 此外,还支持 SQLCipher, RXJava 等
  3. Multiple Databases, Multiple Modules(多数据库、多模型):无缝支持多数据库文件以及使用 DBFlow 的其他依赖中的数据库模型
  4. Built On SQLite(基于 SQLite):SQLite 是世界上使用最广泛的数据库引擎,它不仅限于某个平台。

配置 DBFlow

因为 DBFlow 任然不是官方发布的,你需要在项目的 build.gradle 文件中进行如下配置,具体如下:

allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}

然后,在 Module 对应的 build.gradle 文件中添加依赖,具体如下:

//为了方便可使用 def 关键字定义版本号
def dbFlow_version = "4.2.4"
dependencies {
//...
annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:${dbFlow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbFlow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow:${dbFlow_version}"
}

上面代码中的依赖只是针对于 Java,如果你要使用 Kotlin、RxJava 等要配置相对应的依赖即可。

注意:升级新版本的 DBFlow 时,一定要删除旧版本的依赖,因为新旧版本的注解处理器可能不同,如果未移除旧版本,将会报如下错误,具体如下:

java.lang.NoSuchMethodError: com.raizlabs.android.dbflow.annotation.Table.tableName()Ljava/lang/String

然后,自定义 Application ,在相应的 onCreate() 方法中初始化 DBFlow,具体如下:

/**
* 自定义Application
* @author jzman
* create at 2018/4/16 0016 17:28
*/
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//初始化DBFlow
FlowManager.init(new FlowConfig.Builder(this).build());
//设置日志显示
FlowLog.setMinimumLoggingLevel(FlowLog.Level.V);
}
}

最后,在 AndroidManifest.xml 文件中使用自定义的 Application,具体如下:

<application
android:name=".app.MyApplication"
// ...
</application>

此时,DBFlow 就引入当前项目中咯。

创建数据库

创建一个类并使用 @Database 注解来定义自己的数据库,该类应该要定义数据库的名称和数据库的版本,具体如下:

/**
* MyDatabase
* @author jzman
* create at 2018/4/17 0017 9:08
*/
@Database(name = MyDatabase.NAME, version = MyDatabase.VERSION)
public class MyDatabase {
//数据库名称
public static final String NAME = "MyDatabase";
//数据库版本号
public static final int VERSION = 1;
}

注意:如果以后要修改任意表的结构,为避免与旧版本数据库冲突一定要修改版本号,且保证版本号只升不降。

创建表

在已经创建好数据库的前提下就可以创建表了,表的模型类一般需要继承 BaseModel,并为模型类中的每个字段添加 @Column 注解,该注解将映射模型类的字段到对应表中的列,定义一张表具体如下:

/**
* NoteTable.java
* @author jzman
* create at 2018/4/17 0017 9:54
*/
@Table(database = MyDatabase.class)
public class NoteTable extends BaseModel {
@Column
@PrimaryKey
int id;
@Column
private String title;
@Column
private String date;
@Column
private String content; public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}

注意:在一张表中至少必须定义一个字段作为主键(primary key),如果模型类中某个字段是私有的,一定要定义相应的 getter、setter 方法,否则会在创建表的环节失败,表的命名要使用驼峰命名法,否则可能会出现如此下问题:

java.lang.IllegalArgumentException: expected type but was null

插入数据

使用 DBFlow 插入数据常用的有二种方式,具体如下:

1. model.insert()

2. SQLite.insert()

前者用于单个模型类对象的的插入,创建完具体的对象后,调用 model.insert() 即可插入该对象所对应的记录;后者使用 SQLite Wrapper Language 来插入数据,类似于原生的 insert 语句,支持多列数据的插入,使用起来比较方便,具体参考如下:

/**
* 插入数据
* @param model
*/
public void inseartData(NoteBean model){
//1.model,insert()
model.setTitle("title");
model.setDate("2018-04-17");
model.setContent("content");
model.insert();
//2.SQLite.insert()
SQLite.insert(NoteBean.class)
.columns(NoteBean_Table.title,NoteBean_Table.date,NoteBean_Table.content)
.values("title","2018-04-17","content")
.execute();
}

删除数据

使用 DBFlow 删除数据常用的有二种方式,具体如下:

1. model.delete():删除某条记录

2. SQLite.delete():根据条件删除

前者用于单个模型类对象的的删除,创建完具体的对象后,调用 model.delete() 即可删除该对象所对应的记录;后者使用 SQLite Wrapper Language 来条件删除数据,类似于原生的 delete 语句,使用起来比较方便,具体参考如下:

/**
* 删除数据
* @param model
*/
public void deleteData(NoteBean model){
//1.model.delete()
model.delete();
//2.SQLite.delete()
SQLite.delete(NoteBean.class)
.where(NoteBean_Table.title.is("title"))
.and(NoteBean_Table.id.is(10))
.async()
.execute();
//删除整张表
Delete.table(NoteBean.class);
//删除多张表
Delete.table(NoteBean.class,NoteBean1.class);
}

更新数据

使用 DBFlow 删除数据常用的有二种方式,具体如下:

1. model.update():更新某条记录

2. SQLite.update():根据条件更新某条记录

前者用于单个模型类对象的的更新,创建完具体的对象后,调用 model.update() 即可更新该对象所对应的记录;后者使用 SQLite Wrapper Language 来条件删除数据,类似于原生的 update 语句,使用起来比较方便,具体参考如下:

/**
* 更新数据
* @param model
*/
public void updateData(NoteBean model) {
//1.model.update()
model.update();
//2.SQLite.update()
SQLite.update(NoteBean.class)
.set(NoteBean_Table.title.eq("title"),
NoteBean_Table.content.eq("content"))
.where(NoteBean_Table.id.is(10))
.async()
.execute();
}

查询数据

查询使用 SQLite.select() 方法,查询还有许多可以作为条件的关键字,这里就不在赘述了,下面是一个开发者做常用的查询,具体参考如下:

/**
* 查询数据
*/
public List<NoteBean> queryData(){
//根据条件查询
List<NoteBean> noteBeans = SQLite.select()
.from(NoteBean.class)
.where(NoteBean_Table.title.is("title"))
.queryList();
return noteBeans;
}

注意:对于插入、更新操作可以使用 model.save() 方法。

案例

上文中介绍了 DBFlow 的配置以及增删改查等基本操作,DbFlow 还有其他比较高级的用法,比如使用 Transactions 来进行数据的安全操作等,下面写一个简单的案例来结束对 DBFlow 的学习,具体效果如下:

更多关于 DBFlow 的知识请参考 DBFlow 的 GitBook

如果觉得对自己有帮助,可以关注微信公众号:jzman-blog,一起交流学习。

Android 数据库框架 DBFlow 的使用的更多相关文章

  1. Android 数据库框架OrmLite的使用(一)

    在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...

  2. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  3. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  4. Android 数据库框架ormlite

    Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...

  5. Android 数据库框架总结(转)

    转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...

  6. Android数据库框架-----ORMLite关联表的使用

    上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用 ...

  7. Android数据库框架-----ORMLite 的基本用法

    ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...

  8. DBExecutor android 数据库框架

    https://github.com/eltld/DBExecutor android 数据库框架,sqlite database

  9. Android 数据库框架总结,总有一个适合你!

    一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...

随机推荐

  1. Java基础--选择排序

    每一趟从待排序的数据元素中选出最小(或最大的)一个元素, 顺序放在已排好的序的数列的最后,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法. 选择排序的时间复杂度为 O(n^2). 第一次需 ...

  2. 【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询

    Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application ...

  3. Python基础知识(day1)

    day1 1.编码 ASCII码 1字节8位 2^8 = 256 位 万国码 unicode 4字节32位 #浪费空间 UTF-8 对unicode进行压缩 2.注释 单行注释 score = inp ...

  4. 负载均衡框架 ribbon 二

    Ribbon 负载均衡机制 官方文档地址:https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers 1. Ribbon 内置 ...

  5. vue 带参数的跳转-完成一个功能之后 之后需要深思,否则还会忘记

    我要写详细点,否则下次很容易忘记 写了一个页面,这个页面里面添加了 很多a 标签,跳转都是同一个页面,内容不一样,方法 首先 路由 设定好 routes:[ { path:'/aaa', name:' ...

  6. ES6的函数

    1,带参数默认值的函数 JS函数有个独特的行为:可以接受任意数量的参数,而无视函数声明的形参数量.未提供的参数会使用默认值来代替.实际传递的参数允许少于或多于正式指定的参数. 在ES6中可以直接在形参 ...

  7. vnstat 流量统计 并附带一个小 php 查看流量的页面

    安装apt-get install vnstat 配置到自动启动update-rc.d vnstat enable 启动/etc/init.d/vnstat start vnstat基本使用命令 vn ...

  8. 面试总被问分布式ID怎么办? 滴滴(Tinyid)甩给他

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...

  9. 题解 NOIP2018【赛道修建】—— 洛谷

    这道题有一点点树上dp的意思(大佬轻喷 我刚拿到这道题的时候毫无头绪,只知道这道题要二分答案 为什么是二分答案??? 题目: 目前赛道修建的方案尚未确定.你的任务是设计一 种赛道修建的方案,使得修建的 ...

  10. 在Windows中像Linux里一样使用CMake和make

    1. 安装GCC环境 1.1 安装MinGW(Minimalist GNU for Windows) 首先下载MinGW,并安装.安装完成之后运行MinGW Installer.界面如下.勾选自己需要 ...