参考
一.准备工作
在工程的build.gradle文件中添加
repositories {
...
mavenCentral()
}
dependencies {
...
classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0'
}
在项目的build.gradle文件中添加
apply plugin: 'org.greenrobot.greendao'
android {
...
greendao {
schemaVersion 1
daoPackage 'com.greendao.database.dao'
targetGenDir 'src/main/java'
}
}
(1)schemaVersion:指定数据库schema版本号,迁移等操作会用到;
(2)daoPackage:通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名;
(3)targetGenDir:自定义生成数据库文件的目录,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了。
dependencies {
...
implementation 'org.greenrobot:greendao:3.3.0'
}
(1)当Bean类对象发生改变时,schemaVersion的数值要增加。
(2)目前引用的版本是最新版,后续更新要注意上方的参考文档。
(3)如果是在libiray中使用,implementation 一定要换成api
二. 创建实体类
例:
@Entity
public class TestUser {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
@NotNull
private int age;
@NotNull
private String sex;
@Index(unique = true)
private String uid;
}
主键一定要大写的Long。
点击Build → Make Project会自动生成代码。
@Entity
public class TestUser {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
@NotNull
private int age;
@NotNull
private String sex;
@Index(unique = true)
private String uid;
@Generated(hash = 1872927493)
public TestUser(Long id, @NotNull String name, int age, @NotNull String sex,
String uid) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.uid = uid;
}
@Generated(hash = 925009630)
public TestUser() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getUid() {
return this.uid;
}
public void setUid(String uid) {
this.uid = uid;
}
}
这个类要用到很多的注解,我也简单的整理了一下。
注解 | 参数 | 解释 |
---|---|---|
@Entity | … | @Entity注释标记的Java类作为greenDAO一个presistable实体。 |
@Id | autoincrement | 主键,参数autoincrement 是使ID值不断增加(不重用旧值)的标志,必须是long或Long属性作为其主键。 |
@NotNull | 无 | 表明值不能为空 |
@Index | unique | 在属性上使用@Index为相应的数据库列创建数据库索引,unique =true表明强制所有值都是唯一的 |
注解就先整理这些,具体可以在使用时有目的的查询或参考官方文档。
三.初始化
可以将初始化以及增删改查进行封装,在初始化时需要context而且只需要初始化一次,为防止内存泄露所以我们将初始化放在Application进行操作。
public class GreenDaoManager {
private static GreenDaoManager greenDaoManager;
private DaoMaster daoMaster;
private DaoSession daoSession;
private Context context;
private DaoMaster.DevOpenHelper helper;
/**
* 私有化
*/
private GreenDaoManager() {
}
/**
* 对外暴露的获取方法
*
* @return 单例对象
*/
public static GreenDaoManager getInstance() {
if (null == greenDaoManager) {
synchronized (GreenDaoManager.class) {
if (null == greenDaoManager) {
greenDaoManager = new GreenDaoManager();
}
}
}
return greenDaoManager;
}
/**
* 初始化
*
* @param context 上下文
*/
public void init(Context context) {
this.context = context;
}
/**
* 获取管理特定架构的所有可用DAO对象
*
* @return daoSession
*/
public DaoSession getDaoSession() {
if (daoSession == null) {
if (daoMaster == null) {
daoMaster = getDaoMaster();
}
daoSession = daoMaster.newSession();
}
daoSession.clear();
return daoSession;
}
/**
* 是否打印 数据库的日志信息 默认不开启
*/
public void setDebug(Boolean isDebug) {
QueryBuilder.LOG_SQL = isDebug;
QueryBuilder.LOG_VALUES = isDebug;
}
/**
* 关闭所有的操作 数据库用完的时候必须关闭 节省资源
*/
public void closeConnection() {
closeHelper();
closeSession();
}
/**
* 判断是否存在数据库,如果没有则创建数据库
*
* @return DaoMaster
*/
private DaoMaster getDaoMaster() {
if (null == daoMaster) {
helper = new DaoMaster.DevOpenHelper(context, "test-db", null);
SQLiteDatabase db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
}
return daoMaster;
}
/**
* 关闭 help
*/
private void closeHelper() {
if (helper != null) {
helper.close();
helper = null;
}
}
/**
* 关闭 会话
*/
private void closeSession() {
if (daoSession != null) {
daoSession.clear();
daoSession = null;
}
}
}
这里面用到了单例模式,可以参考我之前的博客。