033-Android存储(8):DBFlow使用详解

919 阅读2分钟

【代码是最好的老师】

1.概述

GitHub直达DBFlow

DBFlow是一个注解化(AnnotationProcessing)的ORM框架:

  1. 同Springboot一样的编码思维,让开发更专注于逻辑而不是死板的db代码
  2. 支持同步/异步/事务操作
  3. 支持自定义数据库储放路径
  4. 使用灵活、简洁,可读性高
  5. 编译期代码生成,运行时对性能是零损耗的,不逊于其他数据库框架
  6. 支持懒加载
  7. 【大招】可以直接注解化生成content provider依赖Schematic库

2.关于

DBFlow的灵魂精髓在于,严格使用注解生成SQLiteDataBase/SQLiteOpenHelper等基础代码。

既简化了代码编写,同时又不损失性能(编译时生成中间代码、非运行时反射)

注解快捷生成ContentProvider是DBFlow的另一大精髓,DBFlow是Android敏捷开发的示范框架

3.配置

本教程有缺失或过时,请参考 官方文档教程

step1:在项目根目录的build.gradle中添加jitpack源

maven { url "https://www.jitpack.io" }

如(dbflow step1-1、dbflow step1-2):

buildscript {
    repositories {
        google()
        jcenter()
        //dbflow step1-1
        maven { url "https://www.jitpack.io" }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.2"
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        //dbflow step1-2
        maven { url "https://www.jitpack.io" }
    }
}

step2:配置混淆规则

按使用版本更新混淆规则,参考GitHub DBFlow

# dbflow step2
# 5.0-
 -keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; }
# 5.0+ btw:5.0后变更了包名
# -keep class * extends com.dbflow5.config.DatabaseHolder { *; }

step3:module导入依赖库

//定义依赖库版本号
def dbflow_version = "4.2.4"
def sqlcipher_version = "3.4.0"
android{
    ...
}
dependencies {
...
//dbflow begin
//==============================================================================
annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:$dbflow_version"
implementation "com.github.Raizlabs.DBFlow:dbflow-core:$dbflow_version"
implementation "com.github.Raizlabs.DBFlow:dbflow:$dbflow_version"
//==============================================================================
//dbflow end

}

配置完,sync

4.使用

step4:初始化配置

app的application中init

public class BDFlowApplication extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        DBManager.init(this);
    }
}

项目采用组件化,故多封装了一层

public class DBManager {
    public static void  init(Context context){
        FlowManager.init(context);
    }
}

记得AndroidManifest.xml中配置,否则不会初始化DBFlow

<application
        android:name=".BDFlowApplication"
        ...

4.1 创建数据库

使用注解@Database声明数据库配置类。

@Database(name = AppDB.DB_NAME ,version = AppDB.DB_VERSION)配置数据库名称、版本号

@Database(name = AppDB.DB_NAME ,version =  AppDB.DB_VERSION)
public class AppDB {
    public static final String DB_NAME ="AppDB";
    public static final int DB_VERSION =1;
}

创建

4.2 创建表(设计表)

继承BaseModel并使用注解@Table声明实体类为数据库对应的表,然后build project ,生成中间代码。

使用注解@PrimaryKey(autoincrement = true),声明变量为主键,同时设置自增长。

使用@Column声明变量为数据列

@Table(database = AppDB.class)
public class User extends BaseModel {

    @PrimaryKey(autoincrement = true)
    private long id ;

    @Column
    private String account ;

    @Column
    private String password;

    @Column
    private String name;
    
    @Column
    private int age;
    
    @Column
    private long loginMill;
    
    //...
    //setter & getter

组件化跨模块帮助类:

package com.cupster.func_db_dbflow.db_main.crud;
import android.util.Log;
import com.cupster.func_db_dbflow.db_main.table.User;
import com.cupster.func_db_dbflow.db_main.table.User_Table;
import com.raizlabs.android.dbflow.sql.language.SQLite;
import com.raizlabs.android.dbflow.structure.database.transaction.QueryTransaction;
import com.raizlabs.android.dbflow.structure.database.transaction.Transaction;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class UserHelper {
    public static boolean insert(String name){
        User user = new User();
        user.name = name ;
        user.age = 27;
        user.account ="18960";
        user.pwd ="123";
        user.money = 5000.0;
        return user.save();
    }
    //增删改查同理字段筛选
    public static void update(String newName,String name ){
        SQLite.update(User.class)
                .set(User_Table.name.eq(newName))
                .where(User_Table.name.eq(name))
                .execute();
    }

    public static boolean  updateOld(String newName,String name ){
        User user = SQLite.select()
                .from(User.class)
                .where(User_Table.name.is(name))
                .querySingle();
        if (user != null){
            user.name = newName;
            return user.update();
        }else {
            return false;
        }
    }

    public static void delete(String name ){
        SQLite.delete(User.class)
                .where(User_Table.name.is(name))
                .execute();
    }

    //单个查询
    public String selectUser(){
        User user = SQLite.select().from(User.class)
                .where(User_Table.name.is("Cupster")).querySingle();
        return user.name;
    }
    //多个查询
    public String selectUserList(){
        List<User> userList = SQLite.select().from(User.class)
                .where(User_Table.name.like("C%")).queryList();
        return userList.toString();
    }
    //单个 异步查询
    public void selectUserAsync(){
        SQLite.select().from(User.class)
                .where(User_Table.name.is("Cupster")).async().querySingleResultCallback(new QueryTransaction.QueryResultSingleCallback<User>() {
                    @Override
                    public void onSingleQueryResult(QueryTransaction transaction, @Nullable User user) {
                        if (user != null){
                            Log.i( "onSingleQueryResult: ","query name : "+user.name);
                        }
                    }
                }).error(new Transaction.Error() {
                    @Override
                    public void onError(@NonNull Transaction transaction, @NonNull Throwable error) {
                        Log.i( "onError: ","");
                    }
                }).success(new Transaction.Success() {
                    @Override
                    public void onSuccess(@NonNull Transaction transaction) {
                        Log.i( "onSuccess: ",transaction.name());
                    }
                }).execute();
    }
    //数据库升级
}

5.其他

数据库升级

5.1新增表

仅需编写新增表类,数据库版本号+1,编译、运行

5.2新增表的列项

继承 类 AlterTableMigration 用于重命名表,增加列

继承 类 IndexMigration/IndexPropertyMigration 用于索引创建和删除

继承 类 UpdateTableMigration 升级数据库的时候更新数据




升级表,添加数据列

package com.cupster.func_db_dbflow.db_main.alter;

import com.cupster.func_db_dbflow.db_main.AppDB;
import com.cupster.func_db_dbflow.db_main.table.User;
import com.raizlabs.android.dbflow.annotation.Migration;
import com.raizlabs.android.dbflow.sql.SQLiteType;
import com.raizlabs.android.dbflow.sql.migration.AlterTableMigration;

@Migration(version = AppDB.DB_VERSION, database = AppDB.class)
public class AddSingleName extends AlterTableMigration<User> {

    public AddSingleName(Class<User> table) {
        super(table);
    }

    @Override
    public void onPreMigrate() {
        addColumn(SQLiteType.TEXT ,"single_name");
    }
}

代码demo