5.0.0版本的DBFlow使用方法和以前的版本不太同样,看了官网教程也是一脸懵逼的不知所措,通过屡次试验,初步实现正常使用。java
DBFlow githubreact
在工程的build.gradle文件中添加:android
allProjects {
repositories {
google()
// required to find the project's artifacts // place last maven { url "https://www.jitpack.io" } } } 复制代码
在项目的build.gradle文件中配置相应依赖,根据须要选择:git
apply plugin: 'kotlin-kapt' // only required for kotlin consumers.
def dbflow_version = "5.0.0-alpha1"
// or 10-digit short-hash of a specific commit. (Useful for bugs fixed in develop, but not in a release yet)
dependencies {
// Use if Kotlin user.
kapt "com.github.agrosner.dbflow:processor:${dbflow_version}"
// Annotation Processor
// if only using Java, use this. If using Kotlin do NOT use this.
annotationProcessor "com.github.agrosner.dbflow:processor:${dbflow_version}"
// core set of libraries
implementation "com.github.agrosner.dbflow:core:${dbflow_version}"
implementation "com.github.agrosner.dbflow:lib:${dbflow_version}"
// sql-cipher database encryption (optional)
implementation "com.github.agrosner.dbflow:sqlcipher:${dbflow_version}"
implementation "net.zetetic:android-database-sqlcipher:${sqlcipher_version}@aar"
// RXJava 2 support
implementation "com.github.agrosner.dbflow:reactive-streams:${dbflow_version}"
// Kotlin Coroutines
implementation "com.github.agrosner.dbflow:coroutines:${dbflow_version}"
// Android Architecture Components Paging Library Support
implementation "com.github.agrosner.dbflow:paging:${dbflow_version}"
// adds generated content provider annotations + support.
implementation "com.github.agrosner.dbflow:contentprovider:${dbflow_version}"
}
复制代码
固然,最重要的仍是如何使用,官方文档给出的使用方法对与5.0.0版本不太适用。github
新建一个数据库初始化类,使用DBFlow的Database注解来告诉DBFLow该类是咱们要使用的数据信息提供者。sql
@Database(version = AppDataBase.VERSION)
public abstract class AppDataBase extends DBFlowDatabase {
//没法使用Database注解的name属性为数据库指定名称
//public static final String DB_NAME = AppDataBase.class.getSimpleName();
public static final int VERSION = 1;
}
复制代码
数据库的名称便是咱们建立的类名AppDataBase。官网上说可使用以下方法指定数据库名称,可是好像并无效果,甚至还会报编译错误——getDataBaseName方法为final,不能重写。导致不能在注解中使用name属性,这就是上边为何没有设置数据库名称的缘由。另外注意到,咱们建立的类须要继承DBFlowDatabase,而且加了abstract关键字修饰。数据库
//报错的官网文档代码
@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
public class AppDatabase {
public static final String NAME = "AppDatabase";
public static final int VERSION = 1;
}
复制代码
在自定义Application的onCreate方法中对DBFlow进行初始化:json
@Override
public void onCreate() {
super.onCreate();
FlowManager.init(this);
···
}
复制代码
以上初始化就完成了。bash
新建一个User类继承DBFlow的BaseModel,并添加相关注解,而后须要rebuild一下工程,自动生成一些中间类,以下:app
@Table(database = AppDataBase.class)
public class User extends BaseModel {
@PrimaryKey
String userId;
@Column
String name;
@Column
int age;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
复制代码
必需要有一个主键,并用PrimaryKey进行注解,Table注解的database属性就是咱们前边建立的AppDataBase代表该数据表存储在哪一个数据库中。
有两种方式能够实现数据插入操做
User user = new User();
user.setUserId("zach01");
user.setName("半壶清茶");
user.setAge(25);
user.save(FlowManager.getDatabase(AppDataBase.class));
//使用ModelAdapter类进行插入操做
ModelAdapter<User> userModelAdapter = FlowManager.getModelAdapter(User.class);
User user3 = new User();
user3.setUserId("zach04");
user3.setName("半壶清茶4");
user3.setAge(20);
userModelAdapter.insert(user3,FlowManager.getDatabase(AppDataBase.class));
复制代码
ModelAdapter<User> userModelAdapter = FlowManager.getModelAdapter(User.class);
User user3 = new User();
user3.setUserId("zach04");
user3.setName("半壶清茶4");
user3.setAge(20);
userModelAdapter.insert(user3,FlowManager.getDatabase(AppDataBase.class));
复制代码
固然,User继承BaseModel后也能够用ModelAdapter类来进行相关操做。
一样,删除操做也根据是否继承BaseModel,有两种方法,没有继承的话仍然只能使用方法2
//1.User继承了BaseModel
user3.delete(FlowManager.getDatabase(AppDataBase.class));
//2.不论User是否继承BaseModel,均可以使用
userModelAdapter.delete(user3,FlowManager.getDatabase(AppDataBase.class));
复制代码
Java
//指定条件查询
User resUser = SQLite.select()
.from(User.class)
.where(User_Table.userId.eq("zach04"))
.querySingle(FlowManager.getDatabase(AppDataBase.class));
if(resUser!=null){
Log.e(TAG, "test2: \n"+resUser.toString());
}
//批量查询
List<User> userList = SQLite.select()
.from(User.class)
.where(User_Table.age.greaterThan(21))
.queryList(FlowManager.getDatabase(AppDataBase.class));
for(User user:userList){
Log.e(TAG, "test2: \n"+user.toString());
}
复制代码
Kotlin
//批量查询
val userInfoList = (select from User::class.java
where User_Table.age.greaterThan(20)
)
.queryList(FlowManager.getDatabase(AppDataBase::class.java))
for (user in userInfoList){
Log.e(TAG, "test: \n$user")
}
复制代码
另外查出来的List直接使用fastjson打印的话会将BaseModel的信息一块儿输出。
目前就这些吧,基本上可使用了,其余的之后再加。