Android 數據庫框架 DBFlow 5.0.0 Java及Kotlin使用

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繼承了BaseModel類,則能夠直接經過User實例調用save/insert方法進行插入,以下:
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));
複製代碼
  • 若是User沒有繼承BaseModel類,則只能使用ModelAdater類來進行操做,以下:
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的信息一塊兒輸出。

目前就這些吧,基本上可使用了,其餘的之後再加。

相關文章
相關標籤/搜索