greenDAO的使用詳解---(5)greenDAO高級用法

1.greenDao多表關(guān)聯(lián)

  1. 一對一關(guān)聯(lián):使用@ToOne 注解關(guān)聯(lián)對象,通過注解joinProperty參數(shù)來定義一個外鍵,下面是示例代碼:


    image

    使用@ToOne注解的屬性都需要分別進行數(shù)據(jù)庫保存拐袜,先在數(shù)據(jù)庫中插入被注解的對象,把插入成功返回的id值作為外鍵與主表關(guān)聯(lián)


    image

    這樣只要獲得User對象就能通過getFriend()方法獲取User所對應的Friend了,這樣是不是很高效费就,很簡便过蹂。其實getFriend()方法也很簡單,就是在底層幫助我們封裝好了查詢語句而已歪赢,另外getFriend()獲取的對象也是懶查詢機制,只有當我們調(diào)用getFriend()方法的時候单料,greenDao才會執(zhí)行查詢操作埋凯,并將查詢結(jié)果封裝成對象返給我們。如果你想獲取User對象時立即執(zhí)行查詢操作獲取Friend對象扫尖,可以調(diào)用UserDAO類的loadDeep()與queryDeep()方法
    image

    注意:只有bean對象中使用了@ToOne注解的時候白对,編譯代碼,才會在對應的Dao類中生成loadDeep()與queryDeep()方法换怖。

  2. 一對多關(guān)聯(lián):使用@ToMany 注解關(guān)聯(lián)的List甩恼,注解參數(shù)有兩種情況
    如果外鍵可以通過id來定義,可以見到使用下面的形式:


    image

    這種定義方式表述沉颂,將User表中的id值作為外鍵存儲在Customer表userId中
    如果外鍵不可以通過id來定義条摸,可以見到使用下面的形式:


    image

    其實第一種方式可以完全用第二種方式替代,如下:
     @ToMany(joinProperties = { @JoinProperty(name = "id", referencedName = "userId") })
    

下面我是以主鍵可以通過id來定義演示兆览。在保存數(shù)據(jù)庫的時候屈溉,先保存主表,再保存注解對象抬探,這一點剛好和@ToOne注解相反子巾。


image

說明:我在看網(wǎng)上的其他bolg說使用@ToMany注解的時候帆赢,編譯后在對應的Dao類中也會生成loadDeep()與queryDeep()方法,而實際我使用greenDAO3.2.2的時候是沒有生成這兩個方法线梗。個人猜測椰于,也許是因為,如果支持預加載執(zhí)行sql語句查詢多對象數(shù)據(jù)仪搔,如果數(shù)據(jù)量比較大的時候瘾婿,可能會很執(zhí)行很長時間,也很消耗性能烤咧,因此在一對多關(guān)聯(lián)的時候偏陪,greenDAO不支持懶查詢機制,這只是我個人看法煮嫌,如果有不同意見可以在blog留言笛谦,如果有問題也請留言指正。

2.greenDao session緩存導致數(shù)據(jù)不一致問題

在一對多關(guān)聯(lián)中昌阿,如果我們在一次查詢子表后饥脑,更改了子表的數(shù)據(jù),那個再次查詢的時候懦冰,查詢出來的數(shù)據(jù)顯示的還是原來的數(shù)據(jù)灶轰,不會顯示更改后數(shù)據(jù),如下圖示例:


image

如果我們沒有打開注釋代碼刷钢,我們在第一次查詢完User子表中的數(shù)后笋颤,在子表數(shù)據(jù)中添加了一個Customer對象,然后再次執(zhí)行查詢闯捎,發(fā)現(xiàn)兩次查詢出來的結(jié)果一直椰弊。這是因為,我們在第一次執(zhí)行查詢后瓤鼻,會將結(jié)果寫入greenDao的session中,當再次執(zhí)行查詢時候贤重,greenDao發(fā)現(xiàn)和第一次執(zhí)行的查詢是一樣茬祷,就直接在session中取出查詢的結(jié)果,不會去數(shù)據(jù)庫中查詢?nèi)〕鼋Y(jié)果并蝗。注釋的代碼作用就是清除session緩存祭犯,讓每次查詢都去數(shù)據(jù)庫取數(shù)據(jù)。

  • session.clear():清除greenDao的全部sessoin緩存
  • xxxDao().detachAll():清除greenDao中xxxDao的session緩存

3.greenDao 自定義參數(shù)類型

  1. greenDao默認支持的數(shù)據(jù)類型

     boolean, Boolean
     int, Integer
     short, Short
     long, Long
     float, Float
     double, Double
     byte, Byte
     byte[]
     String
     Date
    
  2. 官網(wǎng)文檔給出是示例Demo滚停,將枚舉類型保存到數(shù)據(jù)庫

     @Entity
     public class User {
         @Id
         private Long id;
    
         @Convert(converter = RoleConverter.class, dbType = Integer.class)
         private Role role;
    
         public enum Role {
             DEFAULT(0), AUTHOR(1), ADMIN(2);
             final int id;
             Role(int id) {
                 this.id = id;
             }
         }
    
         public static class RoleConverter implements PropertyConverter<Role, Integer> {
             @Override
             public Role convertToEntityProperty(Integer databaseValue) {
                 if (databaseValue == null) {
                     return null;
                 }
                 for (Role role : Role.values()) {
                     if (role.id == databaseValue) {
                         return role;
                     }
                 }
                 return Role.DEFAULT;
             }
    
             @Override
             public Integer convertToDatabaseValue(Role entityProperty) {
                 return entityProperty == null ? null : entityProperty.id;
             }
         }
     }
    
  • 通過使用 @Convert注解需要保存到數(shù)據(jù)庫中的對象
  • 在@Convert注解參數(shù)中指名進行轉(zhuǎn)換操作的java類和數(shù)據(jù)庫中保存的類型
  • 定義轉(zhuǎn)換類沃粗,實現(xiàn)PropertyConverter接口,重寫里面的兩個轉(zhuǎn)換方法
  1. 自己定義類型键畴,保存到數(shù)據(jù)庫

     @Entity
     public class Friend {
         @Id
         private Long id;
         @Convert(converter =CatConverter.class, columnType =String.class)
         private Cat cat;
     
         public class Cat {
             private String name;
     
             public String getName() {
                 return name;
             }
     
             public void setName(String name) {
                 this.name = name;
             }
         }
         
         public static class CatConverter implements PropertyConverter<Cat,String> {
             //將數(shù)據(jù)庫中的類型轉(zhuǎn)換成java類型
             @Override
             public Cat convertToEntityProperty(String databaseValue) {
                 if(TextUtils.isEmpty(databaseValue)){
                     return null;
                 }
                 return JSON.parseObject(databaseValue,Cat.class);
             }
     
             //將java類型轉(zhuǎn)換成數(shù)據(jù)庫類型
             @Override
             public String convertToDatabaseValue(Cat entityProperty) {
                 if(entityProperty==null){
                     return null;
                 }
                 return JSON.toJSONString(entityProperty);
             }
         }
     }
    

說明:代碼中所使用的json轉(zhuǎn)換工具是fastJson

4.代碼下載地址

源碼下載最盅,請點擊這里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末突雪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涡贱,更是在濱河造成了極大的恐慌咏删,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问词,死亡現(xiàn)場離奇詭異督函,居然都是意外死亡,警方通過查閱死者的電腦和手機激挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門辰狡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垄分,你說我怎么就攤上這事宛篇。” “怎么了锋喜?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵些己,是天一觀的道長。 經(jīng)常有香客問我嘿般,道長段标,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任炉奴,我火速辦了婚禮逼庞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞻赶。我一直安慰自己赛糟,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布砸逊。 她就那樣靜靜地躺著璧南,像睡著了一般。 火紅的嫁衣襯著肌膚如雪师逸。 梳的紋絲不亂的頭發(fā)上司倚,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音篓像,去河邊找鬼动知。 笑死,一個胖子當著我的面吹牛员辩,可吹牛的內(nèi)容都是我干的盒粮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼奠滑,長吁一口氣:“原來是場噩夢啊……” “哼丹皱!你這毒婦竟也來了妒穴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤种呐,失蹤者是張志新(化名)和其女友劉穎宰翅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽室,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡汁讼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阔墩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘿架。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啸箫,靈堂內(nèi)的尸體忽然破棺而出耸彪,到底是詐尸還是另有隱情,我是刑警寧澤忘苛,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布蝉娜,位于F島的核電站,受9級特大地震影響扎唾,放射性物質(zhì)發(fā)生泄漏召川。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一胸遇、第九天 我趴在偏房一處隱蔽的房頂上張望荧呐。 院中可真熱鬧,春花似錦纸镊、人聲如沸倍阐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峰搪。三九已至,卻和暖如春凯旭,著一層夾襖步出監(jiān)牢的瞬間罢艾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工尽纽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人童漩。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓弄贿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親矫膨。 傳聞我的和親對象是個殘疾皇子差凹,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理期奔,服務發(fā)現(xiàn),斷路器危尿,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 目錄 session 緩存 多表關(guān)聯(lián) 多表查詢 自定義參數(shù)類型 與數(shù)據(jù)庫操作相關(guān)的AS插件 session 緩存 ...
    看一季殘花落幕閱讀 1,248評論 1 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法呐萌,類相關(guān)的語法,內(nèi)部類的語法谊娇,繼承相關(guān)的語法肺孤,異常的語法,線程的語...
    子非魚_t_閱讀 31,645評論 18 399
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉济欢,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評論 0 9
  • TypeScript簡介: 微軟開發(fā) javascript的超集 遵循ES6腳本語言的規(guī)范 添加了遵循ES6的語...
    咖啡浮點閱讀 839評論 0 3