Android ORM-GreenDao學習二之進階篇
來源:程序員人生 發布時間:2015-05-12 09:01:10 閱讀次數:5440次
概述
本文講述GreenDao對關系數據的支持。分別為
ToOne,
ToMany.
雙向關聯
Tree Relations
To-One
相當于外鍵關系。
// The variables "user" and "picture" are just regular entities
Property pictureIdProperty = user.addLongProperty("pictureId").getProperty();
user.addToOne(picture, pictureIdProperty);
這將致使產生的User實體類中有1個Picture屬性(getPicture/setPicture);
Relation Names and multiple Relations
每個關聯都有1個名稱。默許情況下關聯的名稱就是目標實體的名稱。所以1般情況下建議主動設置該關聯的名稱以避免重名??梢酝ㄟ^setName()來設置。
Property pictureIdProperty = user.addLongProperty("pictureId").getProperty();
Property thumbnailIdProperty = user.addLongProperty("thumbnailId").getProperty();
user.addToOne(picture, pictureIdProperty);//使用默許的關系名
user.addToOne(picture, thumbnailIdProperty, "thumbnail");//為了避免重名,設置關系名為thumbnail
Property customerId = order.addLongProperty("customerId").notNull().getProperty();
ToMany customerToOrders = customer.addToMany(order, customerId);
customerToOrders.setName("orders"); // Optional
customerToOrders.orderAsc(orderDate); // Optional
產生的代碼中Customer類將多出1個getOrders()
List orders = customer.getOrders();
Resolving and Updating To-Many Relations
To-Many解析第1次使用懶加載,但是1旦加載以后to-many list就會被緩存到1個List當中,后續的要求不會再通過數據庫,而是直接從緩存中返回,所以1旦修改以后,需要對緩存中的數據進行更新。
由于緩存的作用下面的代碼會產生使人困惑的結果:
List orders1 = customer.getOrders();
int size1 = orders1.size();
Order order = new Order();
order.setCustomerId(customer.getId());
daoSession.insert(order);
Listorders2 = customer.getOrders();
// size1 == orders2.size(); // NOT updated
// orders1 == orders2; // SAME list object
所以我們需要對緩存進行Updating
改正后的代碼以下:
List orders = customer.getOrders();
newOrder.setCustomerId(customer.getId());
daoSession.insert(newOrder);
orders.add(newOrder);//更新緩存
對刪除操作也是1樣的。:
List orders = customer.getOrders();
daoSession.delete(newOrder);
orders.remove(newOrder);//更新緩存
但是如果有個時候這些沒法到達你預期的要求或是更新緩存比較困難的情況下,沒關系greendao還提供以下方法resetXxx()
重置緩存:
customer.resetOrders();
List orders2 = customer.getOrders();
雙向關聯To-One與To-many結合使用
Entity customer = schema.addEntity("Customer");
customer.addIdProperty();
customer.addStringProperty("name").notNull();
Entity order = schema.addEntity("Order");
order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
order.addIdProperty();
Property orderDate = order.addDateProperty("date").getProperty();
Property customerId = order.addLongProperty("customerId").notNull().getProperty();
order.addToOne(customer, customerId);
ToMany customerToOrders = customer.addToMany(order, customerId);
customerToOrders.setName("orders");
customerToOrders.orderAsc(orderDate);
這樣便產生了雙向關聯了。
List allOrdersOfCustomer = order.getCustomer().getOrders();
Many-to-Many Relations (n:m)
目前greendao還沒有實現。
Modelling Tree Relations
You can model a tree relation by modelling an entity
having a to-one and a to-many relation pointing to itself:
Entity treeEntity = schema.addEntity("TreeEntity");
treeEntity.addIdProperty();
Property parentIdProperty = treeEntity.addLongProperty("parentId").getProperty();
treeEntity.addToOne(treeEntity, parentIdProperty).setName("parent");
treeEntity.addToMany(treeEntity, parentIdProperty).setName("children");
然后再生成的代碼中我們就能夠進行導航了:
TreeEntity parent = child.getParent();
List grandChildren = child.getChildren();
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈