美文网首页
DBFlow使用篇

DBFlow使用篇

作者: 小言聊编程 | 来源:发表于2018-07-25 09:39 被阅读0次

    需要在Application的onCreate对DBFlow进行初始化

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

    数据库创建、表创建

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

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

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

    @ModelContainer
    @Table(database = AppDatabase.class)
    public class People extends BaseModel {
    @PrimaryKey(autoincrement = true)////自增ID
    public Long id;
    @Column
    public String name;
    @Column
    public int gender; }

    说明:编写完数据表对象后,点击Android studio的build->Make Project(Mac的童鞋直接command+F9)就会使用apt进行了编译,
    查看目录(我的people类放在cn.taoweiji.dbflowexample.db)
    app/build/generated/source/apt/debug/cn/taoweiji/dbflowexample/db
    就可以看到自动生成 People_Adapter、People_Container、People_Table,其中People_Table在后面使用有很大的作用,建议详细看看它的结构。

    增删改

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

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

    查询

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

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

    事务、批量保存

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

    Listpeoples = 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步,修改数据库版本号

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

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

    @ModelContainer
    @Table(database = AppDatabase.class)
    public class People extends BaseModel {
    //自增ID
    @PrimaryKey(autoincrement = true)
    public Long id;
    @Column
    public String name;
    @Column
    public int gender;
    @Column
    public String email; }

    第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{ public Migration_2_People(Classtable) {
    super(table); }
    @Override
    public void onPreMigrate() {

    addColumn(SQLiteType.TEXT, People_Table.email.getNameAlias().getName()); } }

    相关文章

      网友评论

          本文标题:DBFlow使用篇

          本文链接:https://www.haomeiwen.com/subject/ypwhgttx.html