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的信息一块儿输出。

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

相关文章
相关标签/搜索