Android GreenDao數(shù)據(jù)庫

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

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'

設(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.java

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

標(biāo)為可識(shí)別的實(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方法

編譯后的User.java文件

需要注意的是,當(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目錄下:

自動(dòng)生成Dao相關(guān)文件

但是,小問題來了,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í)體類

Admin實(shí)體類

改良后的User實(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為外鍵

新建數(shù)據(jù)庫

6.清除GreenDao緩存

方法一:daoSession.clear(); //清除daoSession的緩存

方法二:dao.detachAll();//清除指定dao類的緩存

清除GreenDao緩存

7.加密

需要添加sqlcipher庫,該庫體體積大,使得APK體積增加5M左右,如果對(duì)安全性要求不高,不建議使用。

第一步:依賴sqlcipher庫?compile 'net.zetetic:android-database-sqlcipher:3.5.7'?

第二步:使用密碼獲取數(shù)據(jù)庫

加密獲取數(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ù)遷移。?

新建MyDevOpenHelper

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

自定義MyDevOpenHelper獲取數(shù)據(jù)庫

注意:表中的數(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

更新數(shù)據(jù)庫版本號(hào)

麻雀雖小,五臟俱全,GreenDao簡單學(xué)習(xí)兩天,小小收獲,也承蒙各位大神的不吝分享。如有不同見解,路過的大神多多指教。。。


上一篇:Android基礎(chǔ)知識(shí)總結(jié)(六)

下一篇:Android XMPP實(shí)現(xiàn)即時(shí)通訊

每天進(jìn)步一點(diǎn)點(diǎn)。。。(190514)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容