Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ORM系列之GreenDao關聯關系映射

Android ORM系列之GreenDao關聯關系映射

編輯:關於Android編程

上一篇文章對greenDao有一個整體的把握 Android ORM系列之GreenDao最佳實踐。這篇文章將重點介紹GreenDao的關聯關系的映射以及實體類的生成。

在GreenDao中,實體類的生成是通過Entity類來進行的,可以說一個Entity對象對應一個實體類。實體類中的屬性可以通過Entity對象的方法進行添加,GreenDao會根據我們添加的屬性自動生成實體類。我們可以通過一系列方法進行操作。

可以自定義一張表的表名

entity.setTableName(test);

如果你要為一個實體類添加一個id,則可以使用

  entity.addIdProperty()

添加一個主鍵,並且自增

  entity.addLongProperty(num).primaryKey().autoincrement();

你可以通過下面的一些列方法增加一個對應類型的字段

entity.addShortProperty();
entity.addIntProperty();
entity.addFloatProperty();
entity.addDoubleProperty();
entity.addLongProperty();
entity.addStringProperty();
entity.addBooleanProperty();
entity.addByteProperty();
entity.addDateProperty();
entity.addByteArrayProperty();

當然你也可以修改列名

entity.addIntProperty().columnName();

表中會有一些約束條件,可以指定字段為主鍵,非空,唯一,也可以指定索引。

entity.addIntProperty().isPrimaryKey()
entity.addStringProperty().notNull();
entity.addIntProperty().unique();
entity.addLongProperty().index();

可以讓實體類實現接口,繼承父類,導入包

entity.implementsSerializable();
entity.implementsInterface(com.test.A);
entity.setSuperclass(com.test.B);
entity.addImport(com.test.B);

如果你想自己添加一些引入包,字段,方法,但是不希望重新生成的時候被覆蓋掉
你可以這麼做

首先調用下面這個方法。

   schema.enableKeepSectionsByDefault();

之後在之指定的塊之間添加代碼。

// KEEP INCLUDES - put your custom includes here
添加引入
// KEEP INCLUDES END

// KEEP FIELDS - put your custom fields here
添加字段
// KEEP FIELDS END

// KEEP METHODS - put your custom methods here
添加方法
// KEEP METHODS END

添加完成後你重寫生成實體類,這三部分之間的內容會被保留

如果你需要ContentProvider的支持,則添加以下代碼

entity.addContentProvider();

之後會自動生成一個ContentProvider

GreenDao對實體類的關聯關系也是支持的很好的。

我們知道,一個人有一張身份證,一張身份證對應一個人,這兩者的關系是一對一。下面我們生成這兩個實體類,並進行一對一映射。

一個人有一些屬性

Entity person = schema.addEntity(Person);
person.addIdProperty().primaryKey();
person.addStringProperty(name);
person.addDoubleProperty(height);
person.addDoubleProperty(weight);

身份證上有身份證號和地址等信息

Entity card = schema.addEntity(Card);
card.addIdProperty().primaryKey();
card.addStringProperty(num);
card.addStringProperty(address);

之後我們通過addToOne方法進行映射

Property idcardPK = person.addLongProperty(cardId).getProperty();
person.addToOne(card, idcardPK);

Property personPK = card.addLongProperty(personId).getProperty();
card.addToOne(person, personPK);

接下來來看一對多映射。在淘寶上購物,一個顧客可能會有多個訂單,但是一個訂單只屬於一個顧客。顧客對訂單是一對多,訂單對顧客是多對一。

隨意在顧客與訂單實體類上增加幾個屬性。

Entity customer = schema.addEntity(Customer);
customer.addIdProperty();
customer.addStringProperty(name);
customer.addDoubleProperty(money);

Entity order = schema.addEntity(Order);
order.setTableName(Orders);
// ORDER is a reserved keyword
order.addIdProperty();
order.addStringProperty(num);
order.addDoubleProperty(desc);

進行關系映射

Property customerId = order.addLongProperty(customerId).getProperty();
customer.addToMany(order,customerId).setName(orders);
order.addToOne(customer,customerId);

還有更復雜的關系就是多對多了,我們知道學生選課系統中,一個學生可以選多門課,一門課可以被多個學生選,這個關系是多對多的。

下面是學生和課程的實體類

Entity student = schema.addEntity(Student);
student.addIdProperty();
student.addStringProperty(studentName).notNull();
student.addIntProperty(studentAge);
student.addDateProperty(studentBirth);
student.addBooleanProperty(studentSex);

Entity course = schema.addEntity(Course);
course.addIdProperty();
course.addStringProperty(courseName).notNull();
course.addStringProperty(courseDesc);
course.addIntProperty(courseTimes);
course.addDoubleProperty(courseCredit);

多對多的映射我們是通過第三張表來完成的

Entity sc = schema.addEntity(StudentCourse);
Property studentId = sc.addLongProperty(studentId).getProperty();
Property courseId = sc.addLongProperty(courseId).getProperty();
sc.addToOne(student,studentId);
sc.addToOne(course, courseId);

student.addToMany(sc, studentId);
course.addToMany(sc,studentId);

此外,還有一種樹形結構的表映射,比如一個樹形菜單,一級菜單下有二級菜單,二級菜單下有三級菜單,但是這些菜單的對象都是同一個類的對象。一個菜單有很多子菜單,但只有一個父菜單。

Entity treeEntity = schema.addEntity(Node);
treeEntity.addIdProperty();
treeEntity.addStringProperty(name);

Property parentIdProperty = treeEntity.addLongProperty(parentId).getProperty();
treeEntity.addToOne(treeEntity, parentIdProperty).setName(parent);
treeEntity.addToMany(treeEntity, parentIdProperty).setName(children);

有時候,一張表中可能會有另一張表的兩個外鍵,比如一個用戶有頭像,還有頭像的縮略圖,但是這兩張圖都是圖像表中的。

Entity picture = schema.addEntity(Picture);
picture.addIdProperty().autoincrement();
picture.addStringProperty(url);

Entity user = schema.addEntity(User);
user.addIdProperty();
user.addStringProperty(account);

這時候我們如果使用

Property pictureId = user.addLongProperty(pictureId).getProperty();
Property thumbnailId = user.addLongProperty(thumbnailId).getProperty();
user.addToOne(picture,pictureId);
user.addToOne(picture,thumbnailId);

將會引起一個錯誤,因為User實體類中有兩個引用指向Picture,但是如果不進行重命名的話這兩個引用的名字就會是一樣的,最終只會存在一個,為了解決這個問題,我們需要使用重載方法進行重命名

Property pictureId = user.addLongProperty(pictureId).getProperty();
Property thumbnailId = user.addLongProperty(thumbnailId).getProperty();
user.addToOne(picture,pictureId,picture);
user.addToOne(picture,thumbnailId,thumbnail);

映射完成之後就是數據的增刪改查了,具體內容參考上一篇博客。Android ORM系列之GreenDao最佳實踐

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved