GreenDAO是一個(gè)對(duì)象關(guān)系映射(ORM Object RelationShop Mapping)的框架,能夠提供一個(gè)接口通過操作對(duì)象的方式去操作關(guān)系型數(shù)據(jù)庫,它能夠讓你操作數(shù)據(jù)庫時(shí)更簡單、更方便。
GreenDao 官網(wǎng):http://greenrobot.org/greendao/
GreenDao 特征介紹:http://greenrobot.org/greendao/features/
GreenDao 學(xué)習(xí)文檔:http://greenrobot.org/greendao/documentation/
GreenDao 更新日志:http://greenrobot.org/greendao/changelog/
GreenDao GitHub地址:https://github.com/greenrobot/greenDAO
GreenDao優(yōu)點(diǎn):
①性能高,號(hào)稱Android最快的關(guān)系型數(shù)據(jù)庫,存取速度快
②內(nèi)存占用小
③庫文件比較小,小于100K,編譯時(shí)間低,而且可以避免65K方法限制
④支持?jǐn)?shù)據(jù)庫加密 ?greendao支持SQLCipher進(jìn)行數(shù)據(jù)庫加密
⑤激活實(shí)體,支持緩存,代碼自動(dòng)生成。
使用步驟:
1.項(xiàng)目配置依賴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'
設(shè)置GreenDao
greendao {
? ? schemaVersion1?//數(shù)據(jù)庫版本號(hào)
? ? daoPackage'com.fengyang.tallynote.greendao' ?//設(shè)置要放置DaoMaster、DaoSession、Dao這些類的包的全路徑
? ? targetGenDir'src/main/java' ??//設(shè)置DaoMaster、DaoSession、Dao目錄
? ? ?generateTests false ?//設(shè)置為true以自動(dòng)生成單元測試。
}
注意:這里我們將com.fengyang.tallynote.greendao目錄作為放置DaoMaster、DaoSession、Dao這些類的包的全路徑,后續(xù)會(huì)提到這個(gè)路徑。
2.新建bean類,這里用User類舉例說明
①新建的User.java長這樣:

②把User類設(shè)置成GreenDao可識(shí)別的數(shù)據(jù)庫類型的實(shí)體類

幾個(gè)注解含義:
@Entity:將java普通類標(biāo)志為一個(gè)能夠被GreenDao可識(shí)別的數(shù)據(jù)庫類型的實(shí)體類;
@nameInDb:在數(shù)據(jù)庫中的名字,如不寫則為實(shí)體中類名;
@Id:設(shè)為主鍵,主鍵不能為int類型。 參數(shù)autoincrement是設(shè)置ID值是否自增;
@Property:可以自定義字段名,注意外鍵不能使用該屬性
@NotNull:屬性不能為空
@Transient:使用該注釋的屬性不會(huì)被存入數(shù)據(jù)庫的字段中
@Unique:該屬性值必須在數(shù)據(jù)庫中是唯一值
@Generated:編譯后自動(dòng)生成的構(gòu)造函數(shù)、方法等的注釋,提示構(gòu)造函數(shù)、方法等不能被修改
@Keep?在GreenDao下次運(yùn)行時(shí)保持不變。注解實(shí)體類:默認(rèn)禁止修改此類;注解其他代碼段,默認(rèn)禁止修改注解的代碼段。
3.build->make project(ctrl +f9)編譯工程,User.java文件變樣了,自動(dòng)加上Constructor方法、getter和setter方法:

需要注意的是,當(dāng)id為主鍵時(shí)并設(shè)為自增時(shí),id的類型應(yīng)該Long,在插入數(shù)據(jù)時(shí)可以是new User(null, "whh0", "whh00"),id設(shè)為null,數(shù)據(jù)庫會(huì)自動(dòng)為其分配自增的id。在修改數(shù)據(jù)庫表的字段類型后,需要?jiǎng)h除User.java后來的生成部分,使用make project重新生成。
并在com.fengyang.tallynote.greendao目錄下自動(dòng)生成DaoMaster、DaoSession、UserDao三個(gè)java文件,如果targetGenDir沒有設(shè)置保存目錄,會(huì)默認(rèn)保存在app->build->generated->source->greendao目錄下:

但是,小問題來了,DaoMaster、DaoSession、UserDao三個(gè)文件是紅色的,原因是自動(dòng)生成的文件沒有自動(dòng)添加到GIT(git->add)。配置完成現(xiàn)在可以隨性地對(duì)數(shù)據(jù)庫操作啦。
解釋這三個(gè)核心類的作用:(from百度)
DevOpenHelper:創(chuàng)建SQLite數(shù)據(jù)庫的SQLiteOpenHelper的具體實(shí)現(xiàn)
DaoMaster:GreenDao的頂級(jí)對(duì)象,作為數(shù)據(jù)庫對(duì)象、用于創(chuàng)建表和刪除表
DaoSession:管理所有的Dao對(duì)象,Dao對(duì)象中存在著增刪改查等API
XxxDAO:數(shù)據(jù)訪問對(duì)象(DAO)持續(xù)存在并查詢實(shí)體。 對(duì)于每個(gè)實(shí)體,GreenDAO生成一個(gè)DAO。 它比DaoSession有更多的持久化方法。
4.進(jìn)行數(shù)據(jù)庫的操作:增刪改查
第一步:創(chuàng)建數(shù)據(jù)庫user.db
DaoMaster.DevOpenHelper daoHelper =new DaoMaster.DevOpenHelper(context, "user.db", null);
第二步:獲取可寫數(shù)據(jù)庫
SQLiteDatabase db = daoHelper.getWritableDatabase();
第三步:獲取數(shù)據(jù)庫對(duì)象
DaoMaster daoMaster =new DaoMaster(db);
第四步:獲取Dao對(duì)象管理者
DaoSession?daoSession = daoMaster.newSession();
第五步:使用daoSession操作數(shù)據(jù)庫,實(shí)現(xiàn)增刪改查
UserDao?userDao = daoSession.getUserDao();
List<User> users; //所有的user
增
userDao.insert(new User(null, "whh0", "whh00")); //新增一條數(shù)據(jù)
void insertInTx(T... entities) 插入list集合
刪
userDao.deleteByKey(users.get(0).getId()); //刪除某個(gè)id的數(shù)據(jù)
userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh"))
.buildDelete().executeDeleteWithoutDetachingEntities(); //刪除名字為whh的數(shù)據(jù)
改
userDao.update(new User(users.get(0).getId(), "whh update", "whh11")); //改
//把名為whh修改成名為wuhh的數(shù)據(jù)
User user =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh")).build().unique();
if (user !=null) {
user.setName("wuhh");
? ? userDao.update(user);
}
查
users =userDao.loadAll(); //查詢所有數(shù)據(jù)
users =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh")).list(); ?//查詢數(shù)據(jù)中名字為whh的數(shù)據(jù)列表
users =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh")).orderDesc(UserDao.Properties.Age).list();?//查詢數(shù)據(jù)中名字為whh且以Age為升序的數(shù)據(jù)列表
組合查詢
users =userDao.queryBuilder().where(UserDao.Properties.Name.eq("whh"), UserDao.Properties.Age.le("10")).list(); //查詢數(shù)據(jù)中名字為whh且Age小于等于10的數(shù)據(jù)列表
users =userDao.queryBuilder().limit(5).offset(1).list(); //查詢所有數(shù)據(jù)僅返回5條數(shù)據(jù)并跳過第一條數(shù)據(jù)
int count =userDao.queryBuilder().list().size(); //返回所有數(shù)據(jù)的個(gè)數(shù)
簡單的GreenDao學(xué)習(xí)總結(jié)結(jié)束啦,每天進(jìn)步一點(diǎn)點(diǎn)。。。(2019-05-13 )
最后,特別感謝:
Android數(shù)據(jù)存儲(chǔ)之GreenDao 3.0 詳解 - 總李寫代碼 - 博客園
Android Study 之 玩轉(zhuǎn)GreenDao 3.2.2 點(diǎn)滴提升逼格~ - 簡書
GreenDAO 完美解決數(shù)據(jù)庫升級(jí)數(shù)據(jù)丟失問題 - AiShengHuo的博客 - CSDN博客
補(bǔ)充擴(kuò)展GreenDao的使用(2019-05-14)
特別感謝:GreenDAO 完美解決數(shù)據(jù)庫升級(jí)數(shù)據(jù)丟失問題 - AiShengHuo的博客 - CSDN博客
5.數(shù)據(jù)表中的一對(duì)多關(guān)系
這里使用Admin與User是一對(duì)多關(guān)系作為說明
Admin實(shí)體類

改良后的User實(shí)體類

build編譯后,自動(dòng)生成AdminDao.java,同時(shí)DaoMaster、DaoSession更新文件內(nèi)容,不重復(fù)生成文件。
注解說明:
@ToMany(referencedJoinProperty ="adminId") //admin和user一對(duì)多關(guān)系,在管理員Admin中聲明,以adminId為外鍵
@ToOne(joinProperty ="adminId") //user和admin多對(duì)一關(guān)系,在用戶User中聲明,以adminId為外鍵

6.清除GreenDao緩存
方法一:daoSession.clear(); //清除daoSession的緩存
方法二:dao.detachAll();//清除指定dao類的緩存

7.加密
需要添加sqlcipher庫,該庫體體積大,使得APK體積增加5M左右,如果對(duì)安全性要求不高,不建議使用。
第一步:依賴sqlcipher庫?compile 'net.zetetic:android-database-sqlcipher:3.5.7'?
第二步:使用密碼獲取數(shù)據(jù)庫

第三步:用獲取的daoSession實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查。如果運(yùn)行出現(xiàn)無法加載相關(guān)so庫的異常,clean或reBuild項(xiàng)目。
8.升級(jí)
不斷版本迭代,一些數(shù)據(jù)庫中的結(jié)構(gòu)也要發(fā)生改變、優(yōu)化,但如果貿(mào)然修改數(shù)據(jù)庫的版本號(hào),只會(huì)把舊數(shù)據(jù)庫的數(shù)據(jù)刪除,再重新創(chuàng)建新表,導(dǎo)致舊數(shù)據(jù)丟失,這樣的做法明顯是不可取的。于是我們需要數(shù)據(jù)庫的升級(jí),也要保證舊數(shù)據(jù)保留。
新建MyDevOpenHelper,繼承DaoMaster.DevOpenHelper,重寫onUpgrade(Database db, int oldVersion, int newVersion)方法,在該方法中使用MigrationHelper進(jìn)行數(shù)據(jù)庫升級(jí)以及數(shù)據(jù)遷移。?

MigrationHelper由網(wǎng)上一位大神攥寫,鏈接:https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#30334668,有兩個(gè)版本,后面一個(gè)適合GreenDao3.0版本,自行選用。

注意:表中的數(shù)據(jù)類型是基礎(chǔ)數(shù)據(jù)類型的包裝類,用Long而不是long,否則會(huì)報(bào)錯(cuò)。合并數(shù)據(jù)后,舊數(shù)據(jù)表中沒有的字段值或賦null值。原來的參與數(shù)據(jù)庫的實(shí)體類需要重新生成構(gòu)造方法和getter/setter。
build項(xiàng)目后,排除所有異常后,在build.gradle文件中配置的greedao中修改數(shù)據(jù)庫版本號(hào),遞增1

麻雀雖小,五臟俱全,GreenDao簡單學(xué)習(xí)兩天,小小收獲,也承蒙各位大神的不吝分享。如有不同見解,路過的大神多多指教。。。
上一篇:Android基礎(chǔ)知識(shí)總結(jié)(六)
下一篇:Android XMPP實(shí)現(xiàn)即時(shí)通訊
每天進(jìn)步一點(diǎn)點(diǎn)。。。(190514)