DBflow的简单使用

需要引入apt和maven,配置项目的 build.gradle

 1 buildscript {
 2   repositories {
 3     jcenter()
 4   }
 5   dependencies {
 6     classpath 'com.android.tools.build:gradle:2.0.0-beta6'  //maybe not need
 7     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 8   }
 9 }
10 
11 allprojects {
12   repositories {
13     jcenter()
14     maven { url "https://jitpack.io" }
15   }
16 }

 

配置app的build.gradle

 1 apply plugin: 'com.android.application'
 2 apply plugin: 'com.neenbedankt.android-apt'
 3 def dbflow_version = "3.0.0-beta5"
 4 android {
 5   compileSdkVersion 23
 6   buildToolsVersion "23.0.2"
 7 
 8   defaultConfig {
 9     applicationId "cn.taoweiji.dbflowexample"
10     minSdkVersion 14
11     targetSdkVersion 23
12     versionCode 1
13     versionName "1.0"
14   }
15   buildTypes {
16     release {
17       minifyEnabled false
18       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19     }
20   }
21 }
22 
23 dependencies {
24   compile fileTree(dir: 'libs', include: ['*.jar'])
25   apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"
26   compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}"
27   compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}"
28 }

 

 

二、数据库创建、表创建

定义数据库

我这里定义了一个名称叫做AppDatabase的数据库,可以根据自己的喜欢进行定义。

 

1 @Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
2 public class AppDatabase {
3   //数据库名称
4   public static final String NAME = "AppDatabase";
5   //数据库版本号
6   public static final int VERSION = 1;
7 }

 

创建数据库对象

必须继承BaseModel,BaseModel包含了基本的数据库操作(save、delete、update、insert、exists),看下面代码可以发现这个表是关联上面定义的数据库,People的id是自增的id。

 1 @ModelContainer
 2 @Table(database = AppDatabase.class)
 3 public class People extends BaseModel {
 4     //自增ID
 5     @PrimaryKey(autoincrement = true)
 6     public Long id;
 7     @Column
 8     public String name;
 9     @Column
10     public int gender;
11 }

 

编写完数据表对象后,点击Android studio的build->Make Project(Mac的童鞋直接command+F9)就会使用apt进行了编译,

查看目录({package}.db)

就可以看到自动生成 People_Adapter、People_Container、People_Table,其中People_Table在后面使用有很大的作用,建议详细看看它的结构。

三、增删改

由于数据表对象继承了BaseModel,已经包含了很多的操作

1 People people = new People();
2 people.name = "Wiki";
3 people.gender = 1;
4 people.save();
5 //people.update();
6 //people.delete();
7 Log.e("Test", String.valueOf(people.id));

 

 

四、查询

//返回所有查询结果
List<People> peoples = new Select().from(People.class).queryList();
//返回单个查询结果
People people = new Select().from(People.class).querySingle();
//查询gender = 1的所有People
List<People> peoples2 = new Select().from(People.class).where(People_Table.gender.eq(1)).queryList();

 

DBFlow的查询方式借鉴ActiveAndroid的,但是比ActiveAndroid功能还要强大。

四、事务、批量保存

事务是一个数据必须具备的,如果保存10000条数据,一条一条保存必然是很慢的,所以就需要用到事务,批量保存。DBFlow的事务非常的强大,同时使用也很复杂,这里就简单介绍批量保存,更多内容请查看官方文档

https://github.com/Raizlabs/DBFlow/blob/master/usage/Transactions.md

List<People> peoples = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    People people = new People();
    people.name = "Wiki";
    people.gender = 1;
    peoples.add(people);
}
//实时保存,马上保存
new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)).onExecute();
//异步保存,使用异步,如果立刻查询可能无法查到结果
//TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)));

 

五、数据库升级(增加表、增加字段等)

如果是新增表无需做特别的处理,直接修改AppDatabase的版本号即可。

如果需要新增字段,除了需要修改AppDatabase的版本号外,还需要做特殊的处理,DBFlow的描述是:Migrations。

例子:对People新增一个email字段

第1步,修改数据库版本号

1 @Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
2 public class AppDatabase {
3   //数据库名称
4   public static final String NAME = "AppDatabase";
5   //数据库版本号,这里修改2
6   public static final int VERSION = 2;
7 }

 

第2步,需要修改数据表对象结构,增加email

 1 @ModelContainer
 2 @Table(database = AppDatabase.class)
 3 public class People extends BaseModel {
 4     //自增ID
 5     @PrimaryKey(autoincrement = true)
 6     public Long id;
 7     @Column
 8     public String name;
 9     @Column
10     public int gender;
11     @Column
12     public String email;
13 }

 

第3步,执行第二步之后,需要build(Android studio的build->Make Project、Mac的童鞋直接command+F9),通过apt更新People_Table,接下来编写Migrations

@Migration(version = 2, database = AppDatabase.class)
public class Migration_2_People extends AlterTableMigration<People> {

    public Migration_2_People(Class<People> table) {
        super(table);
    }

    @Override
    public void onPreMigrate() {
        addColumn(SQLiteType.TEXT, People_Table.email.getNameAlias().getName());
    }
}

 

类名可以更加自己喜欢定义,我个人的规则是,按照数据库版本号和需要更新的数据表来命名,需要注意是:version = 2

 

posted @ 2016-04-07 14:27  旭自东方  阅读(1577)  评论(0)    收藏  举报