引入DBflow库

1 添加仓库托管地址allprojects {

repositories {

google()

jcenter()

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

}

}

2 在moudel的build.gradle中添加#定义DBFlow版本

def dbflow_version = "4.2.4"

#android studio3.1版本 compile关键字已废除,改为 implementation 或 api

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}"

在Application中初始化Dbflow

第一种直接初始化public class App  extends Application{

@Override

public void onCreate() {

super.onCreate();

FlowManager.init(this);

...

}

....

}

第二种带配置参数的初始化public class App  extends Application{

@Override

public void onCreate() {

super.onCreate();

dbFlowInit();

....

}

private void dbFlowInit(){

try {

FlowManager.init(new FlowConfig.Builder(getApplicationContext())

.openDatabasesOnInit(true) .build());

FlowLog.setMinimumLoggingLevel(FlowLog.Level.D);

} catch (Exception e) {

e.printStackTrace();

}

}

....

}

使用第二种方式初始化后数据库表讲创建,第一种方法只创建数据库,库中的表只用进行操作时才创建。

新建AppDatabase类,配置数据库相关参数@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)

public class AppDatabase {

//数据库名称

public static final String NAME = "app_db.db";

//数据库版本号

public static final int VERSION = 1;

}

这里使用@Database注解定义了创建的数据库的名称为 app_db.db,数据库初始化版本号是1。

新建数据库表import com.raizlabs.android.dbflow.structure.BaseModel;

import com.app.AppDatabase;

@Table(database = AppDatabase.class)

public class User extends BaseModel{

@PrimaryKey

public String userId;

@Column

public String userName;

@Column

public String password;

...

}

这里定义了数据库表User 继承了 BaseModel ,@Table注解指定数据库类,@PrimaryKey定义主键,@Column定义表中字段。继承BaseModel后 User将具有save()、update()、delete()三个方法插入、修改、删除表中的单条记录。

数据库升级

新建表:1 创建指定的表结构类;2 将AppDatabase类中的版本号增加:VERSION = 2;import com.raizlabs.android.dbflow.structure.BaseModel;

import com.app.AppDatabase;

@Table(database = AppDatabase.class)

public class Book extends BaseModel{

@PrimaryKey

public String bookId;

@Column

public String bookName;

@Column

public int page;

...

}

表结构增加字段: 1 User类中增加属性address并用@Column标记;2 将AppDatabase类中的版本号增加:VERSION = 3;3 新建类继承AlterTableMigrationimport com.raizlabs.android.dbflow.structure.BaseModel;

import com.app.AppDatabase;

@Table(database = AppDatabase.class)

public class User extends BaseModel{

@PrimaryKey

public String userId;

@Column

public String userName;

@Column

public String password;

@Column

public String address;

...

}

//----------------------------------------

import com.app.model100.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 = 3, database = AppDatabase.class)

public class AlterUser3Migration extends AlterTableMigration {

public AlterUser2Migration(Class table) {

super(table);

}

@Override

public void onPreMigrate() {

addColumn(SQLiteType.TEXT, "address");

}

}

AlterUser3Migration 继承AlterTableMigration的类用于增加表中字段;继承AlterTableMigration传入要修改的表结构类,在 onPreMigrate()方法中增加字段 addColumn(SQLiteType.TEXT, "address");

DBFlow查询 DBFlow 给我没实现的面向对象的查询 SQLiteUser users = SQLite.select().from(User.class).where(User_Table.userId.is("001")).querySingle();

查询userid等于001的用户,次查询最多只查询出一条记录 sql:SELECT * FROM `user` WHERE `userId`='001'List users = SQLite.select().from(User.class).where(User_Table.userName.like("张%")).queryList();

查模糊询用户名以"张"开头的用户信息

说明:

User_Table这是DBFlow给我们自动生成的,如果你定的数据库表没有*_Table的类存在,可以Make你的项目DBFlow就会自动创建。

querySingle() 查询只返回单条记录

select() 查询的自动没有默认是全部

from()指定查询的数据表类

where()增加查询条件

and()并且

or()或者

常用的查询条件操作符

is(), eq()  等介于 =

isNot(), notEq() 等介于  !=

isNull()等介于   IS NULL

isNotNull()等介于  IS NOT NULL

like()等介于 模糊查询

glob()

greaterThan(), greaterThanOrEqual(), lessThan(), lessThanOrEqual()

between()   BETWEEN

in(),

notIn()

排序

// true为'ASC'正序, false为'DESC'反序SQLite.select()

.from(table)

.where()

.orderBy(Customer_Table.customer_id, true)

.queryList();

分组SQLite.select()

.from(table)

.groupBy(Customer_Table.customer_id, Customer_Table.customer_name)

.queryList();

HavingSQLite.select()

.from(table)

.groupBy(Customer_Table.customer_id, Customer_Table.customer_name))

.having(Customer_Table.customer_id.greaterThan(2))

.queryList();

分页SQLite.select()

.from(table)

.limit(3)

.offset(2)

.queryList();

DBFlow中也可以直接使用SQL语句进行查询

FlowCursor  cursor = FlowManager.getWritableDatabase(AppDatabase.class).rawQuery("SELECT * FROM user WHERE userId= ?",new String[]{"001"});

再用cursor给类设置取值时 user.setUserId(cursor.getString(cursor.getColumnIndex("userId"))); 字段 名称要和User类中的属性大小写一致

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐