Android GreenDao数据库

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 配置

Project-gradle 配置

mavenCentral() // add repository

classpath'org.greenrobot:greendao-gradle-plugin:3.2.2' // add GreenDao

②app-gradle 配置

在第二行增加语句:applyplugin:'org.greenrobot.greendao'

app-gradle 配置

在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.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方法

编译后的User.java文件

需要注意的是,当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目录下:

自动生成Dao相关文件

但是,小问题来了,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实体类

Admin实体类

改良后的User实体类

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类的缓存

清除GreenDao缓存

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进行数据库升级以及数据迁移。 

新建MyDevOpenHelper

MigrationHelper由网上一位大神攥写,链接:https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#30334668,有两个版本,后面一个适合GreenDao3.0版本,自行选用。

自定义MyDevOpenHelper获取数据库

注意:表中的数据类型是基础数据类型的包装类,用Long而不是long,否则会报错。合并数据后,旧数据表中没有的字段值或赋null值。原来的参与数据库的实体类需要重新生成构造方法和getter/setter

build项目后,排除所有异常后,在build.gradle文件中配置的greedao中修改数据库版本号,递增1

更新数据库版本号

麻雀虽小,五脏俱全,GreenDao简单学习两天,小小收获,也承蒙各位大神的不吝分享。如有不同见解,路过的大神多多指教。。。


上一篇:Android基础知识总结(六)

下一篇:Android XMPP实现即时通讯

每天进步一点点。。。(190514)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容