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的信息一塊兒輸出。
目前就這些吧,基本上可使用了,其餘的之後再加。