編輯:關於Android編程
上一篇我們介紹了greendao的基本使用方法,如果您還不了解,建議先看下上篇文章再來看這篇會有更好的效果。今天我們來繼續學習greendao的relation部分,即數據表的關聯操作部分,greendao默認支持一對一,一對多的關系操作,多對多目前暫不支持,下面我們來一步步實現greendao的關聯操作;
/**
* <男人表>
*/
Entity man = schema.addEntity("Man");
// 設置表名
man.setTableName("man");
// 身份證號
man.addStringProperty("cardManNum").columnName("cardmannum").primaryKey();
// 姓名
man.addStringProperty("name").columnName("name");
// 年齡
man.addIntProperty("age").columnName("age");
// 家庭住址
man.addStringProperty("address").columnName("address");
/**
* <女人表>
*/
Entity woman = schema.addEntity("Woman");
// 設置表名
woman.setTableName("woman");
// 身份證號
woman.addStringProperty("cardWomanNum").columnName("cardwomannum").primaryKey();
// 姓名
woman.addStringProperty("name").columnName("name");
// 性別
woman.addStringProperty("sex").columnName("sex");
// 年齡
woman.addIntProperty("age").columnName("age");
// 家庭住址
woman.addStringProperty("address").columnName("address");
創建一對一關聯
/**
* <一對一映射>
*/
// 在woman表中插入外鍵(man表的主鍵)進行關聯
Property cardnum = man.addStringProperty("fkmannum").getProperty();
man.addToOne(woman, cardnum);
// 在man表中插入外鍵(woman表的主鍵)進行關聯
Property womanCardNum = woman.addStringProperty("fkwomannum").getProperty();
woman.addToOne(man, womanCardNum);
然後我們插入幾條數據:
man表:
women表:
我們來查詢下張三的媳婦是誰?
ManDao manDao = DBController.getDaoSession().getManDao();
Man man = manDao.queryBuilder().where(ManDao.Properties.Name.eq("張三")).list().get(0);
if (null != man)
{
//我們通過man的getWomen()方法可以直接拿到多對應的women對象
showDbData("張三的媳婦是:"+man.getWoman().getName());
}
/**
* 顧客
*/
Entity customer = schema.addEntity("Customer");
// 設置表名
customer.setTableName("customer");
// customerId設置為主鍵
customer.addLongProperty("customerId").primaryKey();
customer.addStringProperty("name").columnName("name").notNull();
/**
* 訂單
*/
Entity orderinfo = schema.addEntity("OrderInfo");
// 設置表名
orderinfo.setTableName("orderinfo");
// 身份證號碼設置為主鍵
orderinfo.addLongProperty("orderId").primaryKey();
orderinfo.addDoubleProperty("money").notNull();
創建一對多關聯
/**
* 一對多關聯
*
* 當設置了顧客對訂單一對多關聯後,Order實體(和表)中會多一個屬性為customerId,
* 所以通過訂單我們可以得到該顧客信息,而Customer實體(和表)中會多一個List集合變量:
* List orders,表示該顧客的所有訂單,其中orders其實是我們自定義的名字,
* 在剛剛setName("orders")就是給這個變量設置了“orders“名稱,
* 而Customer實體中還提供了一個方法getOrders()表示得到該顧客所有訂單
*
*/
Property property = orderinfo.addLongProperty("customerId").getProperty();
// 一個訂單對應一個顧客
orderinfo.addToOne(customer, property, "customerfk");
customer.addToMany(orderinfo, property).setName("orders");
然後我們插入幾條數據:
Customer表:
OrderInfo表:
我們來查詢下李四的所有訂單號的價格信息:
CustomerDao customerDao = DBController.getDaoSession().getCustomerDao();
Customer customer = customerDao.queryBuilder().where(CustomerDao.Properties.Name.eq("李四")).list().get(0);
if (null != customer)
{
StringBuilder builder = new StringBuilder();
// 通過customer拿到所有訂單信息
List orderInfos = customer.getOrders();
for (int i = 0; i < orderInfos.size(); i++)
{
builder.append("---" + orderInfos.get(i).getMoney() + "\n");
}
showDbData(builder.toString());
}
// 學生
Entity student = schema.addEntity("Student");
student.addLongProperty("studentId").primaryKey();
student.addStringProperty("name").notNull();
// 課程
Entity course = schema.addEntity("Course");
course.addLongProperty("courseId").primaryKey();
course.addStringProperty("courseName").notNull();
// 建立多對多關系,StudentCourse中間表,簡化多對多的關系
Entity studentCourse = schema.addEntity("StudentCourse");
studentCourse.addIdProperty().primaryKey();
創建多對多關聯
Property studentId = studentCourse.addLongProperty("studentId").getProperty();
Property courseId = studentCourse.addLongProperty("courseId").getProperty();
// StudentCourse表分別與student和course表建立一對多關系,實現student和course的多對多
studentCourse.addToOne(student, studentId);
studentCourse.addToOne(course, courseId);
student.addToMany(studentCourse, studentId);
course.addToMany(studentCourse, courseId);
然後我們插入幾條數據:
Student表:
Course表:
StudentCourse表:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160718/201607181013021236.png" title="\" />
我們來查詢下老王選了什麼課:
StudentDao studentDao = DBController.getDaoSession().getStudentDao();
List students = studentDao.queryBuilder().where(StudentDao.Properties.Name.eq("老王")).list();
StringBuilder builder = new StringBuilder();
Student student = students.get(0);
List studentCourses = student.getStudentCourseList();
for (int i = 0; i < studentCourses.size(); i++)
{
StudentCourse studentCourse = studentCourses.get(i);
Course course = studentCourse.getCourse();
builder.append("----課程:" + course.getCourseName() + "----課程ID:" + course.getCourseId());
builder.append("\n");
}
showDbData(builder.toString());
伴隨著新接口PropertyConverter的出現,greendao的實體不再局限於原始的類型,如整數,字符串,日期和布爾值。通過實現PropertyConverter接口,可以定義從實體值到數據庫中的值的轉換。這個功能雖然簡單,但是確非常的強大,保證了充分的靈活性。下面我們就來演示一下json字符串和json對象的轉化,我們在數據庫中存儲json字符串,經過轉換後直接查詢出實體類的對象:
添加一個PersonModel實體類測試:
public class PersonModel implements Serializable
{
private String name;
private String age;
public PersonModel(String name, String age)
{
super();
this.name = name;
this.age = age;
}
public PersonModel()
{
super();
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this.age = age;
}
@Override
public String toString()
{
return "PersonModel [name=" + name + ", age=" + age + "]";
}
}
我們實現PropertyConverter接口來處理轉換邏輯:
/**
*
* 自定義數據庫類型
*
* Json
*/
public class JsonPropertyConverter implements PropertyConverter
{
// 從數據庫取出值後轉為實體類裡的類型
@Override
public PersonModel convertToEntityProperty(String databaseValue)
{
Gson gson = new Gson();
PersonModel model = gson.fromJson(databaseValue, PersonModel.class);
return model;
}
// 轉換實體類該字段對應的數據庫所存放的值
@Override
public String convertToDatabaseValue(PersonModel entityProperty)
{
Gson gson = new Gson();
return gson.toJson(entityProperty);
}
}
創建jsontable表:
/**
* 添加自定義屬性
* 此處用的gson解析
* @param schema
* @see [類、類#方法、類#成員]
*/
private static void addPropertyConverter(Schema schema)
{
Entity item = schema.addEntity("JsonTable");
item.addIdProperty().primaryKey();
//第一個參數是我們轉換後的類型的全路徑,第二個是轉化器類的路徑
item.addStringProperty("model").customType("com.relation.dao.PersonModel", "com.relation.dao.JsonPropertyConverter");
}
往表裡插入數據:
JsonTableDao jsonTableDao = DBController.getDaoSession().getJsonTableDao();
JsonTable jsonTable = new JsonTable();
PersonModel model = new PersonModel();
model.setName("周星馳");
model.setAge("45");
jsonTable.setModel(model);
jsonTableDao.insertInTx(jsonTable);
查詢id為1的數據:
JsonTableDao jsonTableDao = DBController.getDaoSession().getJsonTableDao();
JsonTable jsonTable = jsonTableDao.queryBuilder().where(JsonTableDao.Properties.Id.eq(1)).unique();
PersonModel model = jsonTable.getModel();
showDbData(model.toString());
點擊查詢即可查詢出對應的model類型的數據,可以方便我們直接使用;
到此本篇介紹基本完成,有疑問歡迎留言交流討論!
源碼下載
Service簡介:Service 是Android的四大組件之一,一般用於沒有UI界面,長期執行的後台任務,即使程序退出時,後台任務還在執行。比如:音樂播放。Servi
Android的一些內存知識垃圾回收(GC)垃圾回收包含兩個過程:判定階段,也就是判斷哪些對象可以被回收, 收集階段,是指具體的回收策略。判定階段主要有兩種方式引用計數,
今天是中秋節,先祝各位中秋快樂吧。作為北漂的人,對於過節最大的感觸就是沒氣氛~ 中秋是一個特別重要的節日,小的時候過中秋都是特別快樂的,有月餅吃,和家人上月,過完中秋要去
之前做通訊錄軟件,其中在做撥號盤的時候一直為怎麼實現T9輸入煩惱,上網找了很多帖子,都沒有滿意的答案。不過最後終於是實現了,看社區內好像也有不少朋友需要,在此分享一下。這