編輯:關於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最佳實踐
網格布局標簽是GridLayout。這個布局是android4.0新增的布局。這個布局只有4.0之後的版本才能使用。不過新增了一些東東①跟LinearLayout(線性布
由於RN在Android平台上不支持gif格式的圖片,今天介紹下我們是怎麼處理這個問題的。先來看看我們需要實現的效果,這是一張gif圖片,當我們列表上拉加載下一頁的時候需
用過ios的都知道ios上輸入法關閉的同時會自動關閉輸入框,那麼在android上如何實現監聽輸入法彈出和關閉呢?本篇文章就為你提供了一種可靠的實現方式。演示效果視頻地址
下拉刷新和上拉加載的listview的實現。(1)效果展示:首先看下大致的效果:(2) 具體使用:接著看一下怎麼使用的:2.1 在layout中定義 DropDow