一、前言
在没有使用GreenDao之前,就听说过GreenDao的大名,GreenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。后来在项目中使用了GreenDao的解决方案,感觉很不错,下面将从GreenDao的简单使用和升级迁移来对GreenDao进行介绍和说明。
二、GreenDao的简单使用
2.1 GreenDao导入相应的包
compile 'org.greenrobot:greendao:3.0.1' compile 'org.greenrobot:greendao-generator:3.0.0' |
2.2 配置app的Gradle
apply plugin: 'org.greenrobot.greendao' buildscript { repositories { mavenCentral() } dependencies { classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0' } } greendao { schemaVersion 1 daoPackage 'com.anye.greendao.gen' targetGenDir 'src/main/java' } |
greendao参数说明:
schemaVersion指定了数据库版本号,在数据库升级时会用到
daoPackage通过Gradle插件生成的数据库相关文件的包名,默认情况下为entity所在的包名,这里设置的生成的文件路径com.anye.greendao.gen
targetGenDir 如果该参数没有指定会生成在build/generated的目录下,配置中指定的生成的工程的Java目录中。
2.3 数据库类表的编写
package org.greenrobot.greendao.example; /** * Created by moxie on 2018/4/21. */ import org.greenrobot.greendao.annotation.Convert; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Generated; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.Index; import org.greenrobot.greendao.annotation.NotNull; import java.util.Date; @Entity public class DataItem { @Id private Long id; @NotNull private String text; private String comment; private java.util.Date date; } |
@Entity:将Java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Id:通过这个注解标记的字段必须是Long类型,表明这个字段在数据库中是作为主键,并且默认它是自增长的。
对工程文件进行编译之后数据库类的会自动添加很多代码,参见如下:
package org.greenrobot.greendao.example; /** * Created by moxie on 2018/4/21. */ import org.greenrobot.greendao.annotation.Convert; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Generated; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.Index; import org.greenrobot.greendao.annotation.NotNull; import java.util.Date; @Entity public class DataItem { @Id private Long id; @NotNull private String text; private String comment; private java.util.Date date; @Generated(hash = 1798537172) public DataItem(Long id, @NotNull String text, String comment, java.util.Date date) { this.id = id; this.text = text; this.comment = comment; this.date = date; } @Generated(hash = 1750509646) public DataItem() { } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getText() { return this.text; } public void setText(String text) { this.text = text; } public String getComment() { return this.comment; } public void setComment(String comment) { this.comment = comment; } public java.util.Date getDate() { return this.date; } public void setDate(java.util.Date date) { this.date = date; } } |
2.4 数据库使用前的初始化
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null); DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); DataItemDao dataItemDao = daoSession.getDataItemDao(); |
2.5数据库的操作
增加
Date date = new Date(); DataItem dataItem = new DataItem(1,"zhangsan", "good student", data); dataItemDao.insert(dataItem); |
删除
DataItem dataItem = dataItemDao.queryBuilder().where(DataItemDao.Properties.Text.eq("zhangsan")).build().unique(); if(dataItem != null){ dataItemDao.deleteByKey(dataItem.getId()); } |
修改
DataItem dataItem = dataItemDao.queryBuilder() .where(DataItemDaoDataItemDao.Properties.Id.ge(10), DataItemDao.Properties.Text.like("%90%")).build().unique(); if (user == null) { Toast.makeText(MainActivity.this, "用户不存在!", Toast.LENGTH_SHORT).show(); }else{ dataItem.setText("王五"); dataItemDao.update(user); } |
查询
查询id值介于2到13之间的数据,limit表示查询5条数据
List<DataItem> list = dataItemDao.queryBuilder() .where(UserDao.Properties.Id.between(2, 13)).limit(5).build().list(); for (int i = 0; i < list.size(); i++) { Log.d("google_lenve", "search: " + list.get(i).toString()); } |
三、GreenDao数据库简单使用总结
GreenDao数据库的使用步骤归纳总结包括如下:
1.在Gradle脚本中配置GreenDao的依赖和编译配置,在代码中定义数据库表类DataItem。
2.编译工程,生成DataItem变量的存取函数和构造函数和DataItemDao的数据库操作函数。
3.定义数据库的初始化,获取DataItemDao的对象对数据库进行插入,删除,修改和查询操作。
四、数据库的升级
4.1 背景介绍
现网需要对APP版本升级,但是升级版本中的DataItem中增加了字段,这需要对数据库升级。
修改数据库版本号
greendao { schemaVersion 2//改版本号为2 daoPackage 'com.anye.greendao.gen'; targetGenDir 'src/main/java' } |
DataItem中增加需要添加的字段
package org.greenrobot.greendao.example; /** * Created by moxie on 2018/4/21. */ import org.greenrobot.greendao.annotation.Convert; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Generated; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.Index; import org.greenrobot.greendao.annotation.NotNull; import java.util.Date; @Entity public class DataItem { @Id private Long id; @NotNull private String text; private String addedItem private String comment; private java.util.Date date; } |
数据库表升级
@Override public void onUpgrade(Database db, int oldVersion, int newVersion) { if (oldVersion <= 2) { db.execSQL(String.format("ALTER TABLE %s ADD %s INTEGER DEFAULT 1", dataItemDao.TABLENAME, dataItemDao.Properties.AddedItem.columnName)); } } |