Github地址
配置 DBFlow
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
*/
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=".MyApplication"
</application>
创建数据库
创建一个类并使用 @Database 注解来定义自己的数据库,该类应该要定义数据库的名称和数据库的版本,具体如下:
/**
* MyDatabase
*/
@Database(name = MyDatabase.NAME, version = MyDatabase.VERSION)
public class MyDatabase {
//数据库名称
public static final String NAME = "MyDatabase";
//数据库版本号
public static final int VERSION = 1;
}
注意:如果以后要修改任意表的结构,为避免与旧版本数据库冲突一定要修改版本号,且保证版本号只升不降。
创建表
在已经创建好数据库的前提下就可以创建表了,表的模型类一般需要继承 BaseModel,并为模型类中的每个字段添加 @Column 注解,该注解将映射模型类的字段到对应表中的列,定义一张表具体如下:
@Table(database = MyDatabase.class)
public class NoteTable extends BaseModel {
@Column
@PrimaryKey
public int id;
@Column
public String title;
@Column
public String date;
@Column
public String content;
}
注意:在一张表中至少必须定义一个字段作为主键(primary key),如果模型类中某个字段是私有的,一定要定义相应的 getter、setter 方法,否则会在创建表的环节失败,表的命名要使用驼峰命名法,否则可能会出现如此下问题:
java.lang.IllegalArgumentException: expected type but was null
创建完成后,需要编译一下,点击编译按钮,或者Build->Make Project即可,它会自动生成一些数据库文件,也会提示你创建是否有误!
插入数据
使用 DBFlow 插入数据常用的有二种方式,具体如下:
1.model.insert()
2.SQLite.insert()
前者用于单个模型类对象的的插入,创建完具体的对象后,调用 model.insert() 即可插入该对象所对应的记录;后者使用 SQLite Wrapper Language 来插入数据,类似于原生的 insert 语句,支持多列数据的插入,使用起来比较方便,具体如下:
/**
* 插入数据
*/
public void inseartData(NoteBean model){
//1.model,insert()
model.setTitle("西甲");
model.setDate("2018-10-10");
model.setContent("皇马VS巴萨");
model.insert();
//2.SQLite.insert()
SQLite.insert(NoteBean.class)
.columns(NoteBean_Table.title,NoteBean_Table.date,NoteBean_Table.content)
.values("欧冠","2018-06-17","皇马Vs利物浦")
.execute();
}
删除数据
使用 DBFlow 删除数据常用的有二种方式,具体如下:
1.model.delete():删除某条记录
2.SQLite.delete():根据条件删除
前者用于单个模型类对象的的删除,创建完具体的对象后,调用 model.delete() 即可删除该对象所对应的记录;后者使用 SQLite Wrapper Language 来条件删除数据,类似于原生的 delete 语句,使用起来比较方便,具体如下:
/**
* 删除数据
*/
public void deleteData(NoteBean model){
//1.model.delete()
model.delete();
//2.SQLite.delete()
SQLite.delete(NoteBean.class)
.where(NoteBean_Table.title.is("西甲"))
.and(NoteBean_Table.id.is(1))
.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 语句,使用起来比较方便,具体如下:
/**
* 更新数据
*/
public void updateData(NoteBean model) {
//1.model.update()
model.update();
//2.SQLite.update()
SQLite.update(NoteBean.class)
.set(NoteBean_Table.title.eq("西甲"),
NoteBean_Table.content.eq("皇马"))
.where(NoteBean_Table.id.is(1))
.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() 方法
复杂组合的条件查询,具体参考如下:
OperatorGroup op = OperatorGroup.clause
(
RegisterUserModel_Table.mobile.eq(mobile)//这是一个条件
)
.and(
//这是一个条件
OperatorGroup.clause()
.or(RegisterUserModel_Table.identity.eq(RegisterUserModel.USER_IDENTIFY_BODY))
.or(RegisterUserModel_Table.identity.eq(RegisterUserModel.USER_IDENTIFY_GIRL))
);
List<RegisterUserModel> list = SQLite.select().from(RegisterUserModel.class)
.where(op) //执行的时候的查询的条件
.queryList();
like条件的查询,具体参考如下:
public static List<String> getAppPackageLikeName(String name) {
OperatorGroup op = OperatorGroup.clause()
//字段值以name名开头的条件
.or(AppItem_Table.appName.like(TextUtils.concat(name, "%").toString()))
//字段值以name名结尾的条件
.or(AppItem_Table.appName.like(TextUtils.concat("%", name).toString()))
//字段值以name名处在中间的条件
.or(AppItem_Table.appName.like(TextUtils.concat("%", name, "%").toString()));
List<AppItem> list = SQLite.select().from(AppItem.class)
.where(op).queryList();
return strList;
}
以上就是关于Dbflow的使用。