DBFlow 是一个基于注解处理器开发的使用方便的 ORM Android 数据库,该库简化了不少多余的代码,而且提供了好用的 API 来处理与数据库的交互,让开发者专一 App 的开发。下面将从如下几个方面来学习 DBFlow 数据库框架的使用,具体以下:java
DBFlow 借鉴了一些其余优秀数据库框架的特性,下面是 DBFlow 的优点,具体以下:android
select(name, screenSize).from(Android.class).where(name.is("Nexus 5x")).and(version.is(6.0)).querySingle()
由于 DBFlow 任然不是官方发布的,你须要在项目的 build.gradle 文件中进行以下配置,具体以下:git
allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
而后,在 Module 对应的 build.gradle 文件中添加依赖,具体以下:github
//为了方即可使用 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 就引入当前项目中咯。app
建立一个类并使用 @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 插入数据经常使用的有二种方式,具体以下:
前者用于单个模型类对象的的插入,建立完具体的对象后,调用 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 删除数据经常使用的有二种方式,具体以下:
前者用于单个模型类对象的的删除,建立完具体的对象后,调用 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 删除数据经常使用的有二种方式,具体以下:
前者用于单个模型类对象的的更新,建立完具体的对象后,调用 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,一块儿交流学习。