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
浙公网安备 33010602011771号