實(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();