Android 数据库框架 DBFlow 5.0.0 Java及Kotlin使用

2,216 阅读3分钟

5.0.0版本的DBFlow使用方法和之前的版本不太一样,看了官网教程也是一脸懵逼的不知所措,经过多次试验,初步实现正常使用。

引入到工程

DBFlow github

在工程的build.gradle文件中添加:

allProjects {
  repositories {
    google() 
    // required to find the project's artifacts
    // place last
    maven { url "https://www.jitpack.io" }
  }
}

在项目的build.gradle文件中配置相应依赖,根据需要选择:

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版本不太适用。

初始化数据库:

新建一个数据库初始化类,使用DBFlow的Database注解来告诉DBFLow该类是我们要使用的数据信息提供者。

@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进行初始化:

  @Override
  public void onCreate() {
    super.onCreate();
    FlowManager.init(this);
    ···
  }

以上初始化就完成了。

创建数据实体类,添加注解

新建一个User类继承DBFlow的BaseModel,并添加相关注解,然后需要rebuild一下工程,自动生成一些中间类,如下:

@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的信息一起输出。

目前就这些吧,基本上可以使用了,其他的以后再加。