GreenDao的使用(二)

實(shí)體的關(guān)系

一對(duì)一

一個(gè)學(xué)生(student)只有一個(gè)身份證(idCard)就是一對(duì)一關(guān)系。在greendao中表示這種一對(duì)一關(guān)系的方法是使用@ToOne注解更舞。
Student類:

@Entity
public class Student {
    @Id(autoincrement = true)
    private Long id;

    @NotNull
    private String name;

    @ToOne(joinProperty = "name") //joinProperty表示跟idCard一一對(duì)應(yīng)的屬性名
    private IdCard idCard; //身份證
}

IdCard類:

@Entity
public class IdCard {
    @Id
    private String name; //要將Student類中的joinProperty的屬性名設(shè)置為id(屬性名和類型都要相同)

    @Unique
    private String idNum;
}

接著分別向studentDao和idCardDao插入name為小明的數(shù)據(jù)畦幢。(student不需要setIdCard,只需要將其他屬性設(shè)置好并insert)缆蝉。插入后查找小明的student對(duì)象宇葱,調(diào)用getIdCard,greendao會(huì)自動(dòng)在idCard表中找到name為小明的對(duì)象并返回刊头。

IdCard xiaoMingIdCard = new IdCard();//小明的身份證對(duì)象
xiaoMingIdCard.setName("小明");
xiaoMingIdCard.setIdNum("111");

Student xiaoMing = new Student();//小明的student對(duì)象
xiaoMing.setName("小明");

studentDao.insert(xiaoMing);
idCardDao.insert(xiaoMingIdCard);

Log.d("ToOne",studentDao.loadAll().get(0).getIdCard().getIdNum());//這時(shí)候會(huì)打印出小明的身份證號(hào)碼111

假設(shè)idCard表中還有另外一個(gè)名為小剛的數(shù)據(jù)黍瞧,這時(shí)候如果將小明的身份證設(shè)置成小剛的身份證,那么從student表中的“小明”會(huì)自動(dòng)變成“小剛”原杂。

IdCard xiaoGangIdCard = new IdCard();//小剛的身份證對(duì)象
xiaoGangIdCard.setName("小剛");
xiaoGangIdCard.setIdNum("110");

idCardDao.insert(xiaoGangIdCard);//將小剛的身份證插入表中
Student student = studentDao.loadAll().get(0);//查找出小明的student數(shù)據(jù)
student.setIdCard(xiaoGangIdCard );//將小剛的身份證設(shè)置到小明中
student.update();//更新小明的數(shù)據(jù)庫(kù)數(shù)據(jù)
daoSession.clear();//清理下緩存
Log.d("ToOne",studentDao.loadAll().get(0).getName());
//即使我們沒(méi)有手動(dòng)去修改小明的名字印颤,但此時(shí)“小明”的名字已經(jīng)變成“小剛”了。

PS:student中的getIdCard只能獲取到已存在于idCard表中的數(shù)據(jù)穿肄,換句話說(shuō)年局,如果該學(xué)生的身份證數(shù)據(jù)沒(méi)有插入過(guò)數(shù)據(jù)庫(kù)中的話,即使調(diào)用setIdCard也不會(huì)將這個(gè)“全新的”身份證數(shù)據(jù)存入idCard表中咸产,只能改變student的數(shù)據(jù)矢否。

一對(duì)多

一個(gè)學(xué)生(student)擁有多張信用卡(creditCard)就是一對(duì)多的關(guān)系。表示這種關(guān)系使用@ToMany
Student類:

@Entity
public class Student {
    @Id(autoincrement = true)
    private Long id;

    @NotNull
    private String name;

    @ToMany(referencedJoinProperty = "ownerId")//ownerId為CreditCard類中的一個(gè)屬性脑溢,將自動(dòng)賦值為student的id
    private List<CreditCard> creditCards;//信用卡列表
}

CreditCard類:

@Entity
public class CreditCard {
    @Id
    private Long id;//CreditCard自己的id
    private Long ownerId;//擁有這個(gè)信用卡的student的id僵朗,所以一定要和student的id屬性同類型
    private String name;
    private String cardNum;
}

只要將student的id設(shè)置到creditCard中就完成綁定了。

creditCard.setOwnerId(student.getId());

多對(duì)多

一名學(xué)生有多名老師,一位老師也有多名學(xué)生衣迷,這樣的關(guān)系就是多對(duì)多的關(guān)系。使用@ToMany和@JoinEntity注解以及一個(gè)額外的實(shí)體類實(shí)現(xiàn)酱酬。
StuTcherBean類:

@Entity
public class StuTcherBean {//用于聯(lián)結(jié)Student類和Teacher類的實(shí)體類

    @Id(autoincrement = true)
    private Long Id;

    private Long studentId;//表示Student

    private Long teacherId;//表示Teacher
}

Student類:

@Entity
public class Student {
    @Id(autoincrement = true)
    private Long id;

    @NotNull
    private String name;

    @ToMany
    //JoinEntity表示聯(lián)結(jié)到某個(gè)實(shí)體壶谒。entity屬性表示用于聯(lián)結(jié)的類。source表明自己是那個(gè)膳沽。target表示想要聯(lián)結(jié)的目標(biāo)
    @JoinEntity(entity = StuTcherBean.class,sourceProperty = "studentId",targetProperty = "teacherId")
    private List<Teacher> teachers;
}

Teacher類:

@Entity
public class Teacher {
    @Id(autoincrement = true) //標(biāo)記為id(通常用long類型來(lái)作為id)汗菜,autoincrement為自增長(zhǎng)
    private Long id;

    @NotNull
    private String name;

    @ToMany
    //和Student類的區(qū)別就是source和target對(duì)調(diào)
    @JoinEntity(entity = StuTcherBean.class,sourceProperty = "teacherId",targetProperty = "studentId")
    private List<Student> students;
}

儲(chǔ)存的方法是用需要聯(lián)結(jié)的學(xué)生和老師的Id構(gòu)建一個(gè)StuTcherBean對(duì)象然后insert入數(shù)據(jù)庫(kù)中,就可以用teacher.getStudents()和student.getTeachers()來(lái)獲取綁定的對(duì)象

StuTcherBean bean = new StuTcherBean(null,student.getId(),teacher.getId());//構(gòu)建聯(lián)結(jié)類
daosession.insert(bean);//插入數(shù)據(jù)庫(kù)
student.getTeachers();//讀取該學(xué)生的老師列表
teacher.getStudents();//讀取該老師的學(xué)生列表

數(shù)據(jù)庫(kù)升級(jí)

一般的數(shù)據(jù)庫(kù)升級(jí)只需要改動(dòng)gradle文件中的schemaVersion的值就會(huì)在初始化的時(shí)候進(jìn)行數(shù)據(jù)庫(kù)升級(jí)挑社。也可以手動(dòng)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的自定義升級(jí)陨界,不展開。

數(shù)據(jù)庫(kù)加密

greendao使用SQLcipher痛阻。
首先導(dǎo)入SQLcipher庫(kù)

implementation 'net.zetetic:android-database-sqlcipher:3.5.6'

然后將初始化的代碼做一下修改

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"green_db");
//Database db = helper.getWritableDb();這是不加密的寫法
Database db = helper.getEncryptedWritableDb(“l(fā)ee”);//這是加密寫法菌瘪,lee是密碼隨你喜歡填什么
daoSession = new DaoMaster(db).newSession();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阱当,隨后出現(xiàn)的幾起案子俏扩,更是在濱河造成了極大的恐慌,老刑警劉巖弊添,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件录淡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡油坝,警方通過(guò)查閱死者的電腦和手機(jī)嫉戚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澈圈,“玉大人彬檀,你說(shuō)我怎么就攤上這事∷才” “怎么了凤覆?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拆魏。 經(jīng)常有香客問(wèn)我盯桦,道長(zhǎng),這世上最難降的妖魔是什么渤刃? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任拥峦,我火速辦了婚禮,結(jié)果婚禮上卖子,老公的妹妹穿的比我還像新娘略号。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布玄柠。 她就那樣靜靜地躺著突梦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羽利。 梳的紋絲不亂的頭發(fā)上宫患,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音这弧,去河邊找鬼娃闲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匾浪,可吹牛的內(nèi)容都是我干的皇帮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蛋辈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼属拾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起冷溶,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捌年,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挂洛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礼预,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年虏劲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了托酸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柒巫,死狀恐怖励堡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堡掏,我是刑警寧澤应结,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸦采。R本人自食惡果不足惜盐股,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一唱星、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸玷坠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)八堡。三九已至樟凄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兄渺,已是汗流浹背缝龄。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溶耘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓服鹅,卻偏偏與公主長(zhǎng)得像凳兵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子企软,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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