GreenDAO是一个对象关系映射(ORM Object RelationShop Mapping)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。
GreenDao 官网:http://greenrobot.org/greendao/
GreenDao 特征介绍:http://greenrobot.org/greendao/features/
GreenDao 学习文档:http://greenrobot.org/greendao/documentation/
GreenDao 更新日志:http://greenrobot.org/greendao/changelog/
GreenDao GitHub地址:https://github.com/greenrobot/greenDAO
GreenDao优点:
①性能高,号称Android最快的关系型数据库,存取速度快
②内存占用小
③库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
④支持数据库加密 greendao支持SQLCipher进行数据库加密
⑤激活实体,支持缓存,代码自动生成。
使用步骤:
1.项目配置依赖GreenDao
①Project-gradle 配置
mavenCentral() // add repository
classpath'org.greenrobot:greendao-gradle-plugin:3.2.2' // add GreenDao
②app-gradle 配置
在第二行增加语句:applyplugin:'org.greenrobot.greendao'
在dependencies语句块增加语句compile'org.greenrobot:greendao:3.2.2'
设置GreenDao
greendao {
schemaVersion1 //数据库版本号
daoPackage'com.fengyang.tallynote.greendao' //设置要放置DaoMaster、DaoSession、Dao这些类的包的全路径
targetGenDir'src/main/java' //设置DaoMaster、DaoSession、Dao目录
generateTests false //设置为true以自动生成单元测试。
}
注意:这里我们将com.fengyang.tallynote.greendao目录作为放置DaoMaster、DaoSession、Dao这些类的包的全路径,后续会提到这个路径。
2.新建bean类,这里用User类举例说明
①新建的User.java长这样:
②把User类设置成GreenDao可识别的数据库类型的实体类
几个注解含义:
@Entity:将java普通类标志为一个能够被GreenDao可识别的数据库类型的实体类;
@nameInDb:在数据库中的名字,如不写则为实体中类名;
@Id:设为主键,主键不能为int类型。 参数autoincrement是设置ID值是否自增;
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
@Keep 在GreenDao下次运行时保持不变。注解实体类:默认禁止修改此类;注解其他代码段,默认禁止修改注解的代码段。
3.build->make project(ctrl +f9)编译工程,User.java文件变样了,自动加上Constructor方法、getter和setter方法:
需要注意的是,当id为主键时并设为自增时,id的类型应该Long,在插入数据时可以是new User(null, "whh0", "whh00"),id设为null,数据库会自动为其分配自增的id。在修改数据库表的字段类型后,需要删除User.java后来的生成部分,使用make project重新生成。
并在com.fengyang.tallynote.greendao目录下自动生成DaoMaster、DaoSession、UserDao三个java文件,如果targetGenDir没有设置保存目录,会默认保存在app->build->generated->source->greendao目录下:
但是,小问题来了,DaoMaster、DaoSession、UserDao三个文件是红色的,原因是自动生成的文件没有自动添加到GIT(git->add)。配置完成现在可以随性地对数据库操作啦。
解释这三个核心类的作用:(from百度)
DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现
DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表
DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API
XxxDAO:数据访问对象(DAO)持续存在并查询实体。 对于每个实体,GreenDAO生成一个DAO。 它比DaoSession有更多的持久化方法。
4.进行数据库的操作:增删改查
第一步:创建数据库user.db
DaoMaster.DevOpenHelper daoHelper =new DaoMaster.DevOpenHelper(context, "user.db", null);
第二步:获取可写数据库
SQLiteDatabase db = daoHelper.getWritableDatabase();
第三步:获取数据库对象
DaoMaster daoMaster =new DaoMaster(db);
第四步:获取Dao对象管理者
DaoSession daoSession = daoMaster.newSession();
第五步:使用daoSession操作数据库,实现增删改查
UserDao userDao = daoSession.getUserDao();
List<User> users; //所有的user
增
userDao.insert(new User(null, "whh0", "whh00")); //新增一条数据
void insertInTx(T... entities) 插入list集合
删
userDao.deleteByKey(users.get(0).getId()); //删除某个id的数据
userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh"))
.buildDelete().executeDeleteWithoutDetachingEntities(); //删除名字为whh的数据
改
userDao.update(new User(users.get(0).getId(), "whh update", "whh11")); //改
//把名为whh修改成名为wuhh的数据
User user =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh")).build().unique();
if (user !=null) {
user.setName("wuhh");
userDao.update(user);
}
查
users =userDao.loadAll(); //查询所有数据
users =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh")).list(); //查询数据中名字为whh的数据列表
users =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh")).orderDesc(UserDao.Properties.Age).list(); //查询数据中名字为whh且以Age为升序的数据列表
组合查询
users =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh"), UserDao.Properties.Age.le("10")).list(); //查询数据中名字为whh且Age小于等于10的数据列表
users =userDao.queryBuilder().limit(5).offset(1).list(); //查询所有数据仅返回5条数据并跳过第一条数据
int count =userDao.queryBuilder().list().size(); //返回所有数据的个数
简单的GreenDao学习总结结束啦,每天进步一点点。。。(2019-05-13 )
最后,特别感谢:
Android数据存储之GreenDao 3.0 详解 - 总李写代码 - 博客园
Android Study 之 玩转GreenDao 3.2.2 点滴提升逼格~ - 简书
GreenDAO 完美解决数据库升级数据丢失问题 - AiShengHuo的博客 - CSDN博客
补充扩展GreenDao的使用(2019-05-14)
特别感谢:GreenDAO 完美解决数据库升级数据丢失问题 - AiShengHuo的博客 - CSDN博客
5.数据表中的一对多关系
这里使用Admin与User是一对多关系作为说明
Admin实体类
改良后的User实体类
build编译后,自动生成AdminDao.java,同时DaoMaster、DaoSession更新文件内容,不重复生成文件。
注解说明:
@ToMany(referencedJoinProperty ="adminId") //admin和user一对多关系,在管理员Admin中声明,以adminId为外键
@ToOne(joinProperty ="adminId") //user和admin多对一关系,在用户User中声明,以adminId为外键
6.清除GreenDao缓存
方法一:daoSession.clear(); //清除daoSession的缓存
方法二:dao.detachAll();//清除指定dao类的缓存
7.加密
需要添加sqlcipher库,该库体体积大,使得APK体积增加5M左右,如果对安全性要求不高,不建议使用。
第一步:依赖sqlcipher库 compile 'net.zetetic:android-database-sqlcipher:3.5.7'
第二步:使用密码获取数据库
第三步:用获取的daoSession实现数据库的增删改查。如果运行出现无法加载相关so库的异常,clean或reBuild项目。
8.升级
不断版本迭代,一些数据库中的结构也要发生改变、优化,但如果贸然修改数据库的版本号,只会把旧数据库的数据删除,再重新创建新表,导致旧数据丢失,这样的做法明显是不可取的。于是我们需要数据库的升级,也要保证旧数据保留。
新建MyDevOpenHelper,继承DaoMaster.DevOpenHelper,重写onUpgrade(Database db, int oldVersion, int newVersion)方法,在该方法中使用MigrationHelper进行数据库升级以及数据迁移。
MigrationHelper由网上一位大神攥写,链接:https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#30334668,有两个版本,后面一个适合GreenDao3.0版本,自行选用。
注意:表中的数据类型是基础数据类型的包装类,用Long而不是long,否则会报错。合并数据后,旧数据表中没有的字段值或赋null值。原来的参与数据库的实体类需要重新生成构造方法和getter/setter。
build项目后,排除所有异常后,在build.gradle文件中配置的greedao中修改数据库版本号,递增1
麻雀虽小,五脏俱全,GreenDao简单学习两天,小小收获,也承蒙各位大神的不吝分享。如有不同见解,路过的大神多多指教。。。
上一篇:Android基础知识总结(六)
每天进步一点点。。。(190514)