【代码是最好的老师】
1.概述
DBFlow是一个注解化(AnnotationProcessing)的ORM框架:
- 同Springboot一样的编码思维,让开发更专注于逻辑而不是死板的db代码
- 支持同步/异步/事务操作
- 支持自定义数据库储放路径
- 使用灵活、简洁,可读性高
- 编译期代码生成,运行时对性能是零损耗的,不逊于其他数据库框架
- 支持懒加载
- 【大招】可以直接注解化生成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");
}
}