Schema schema = new Schema(1, de.greenrobot.daoexample); Entity note= schema.addEntity(Note); note.addIdProperty(); note.addStringProperty(text).notNull(); note.addStringProperty(comment); note.addDateProperty(date); new DaoGenerator().generateAll(schema, ../DaoExample/src-gen);
Schema代表你的資料庫,Entity代表你要產生的資料表結構。向Entity添加屬性相當於添加列結構。
注意:../DaoExample/src-gen路徑必須存在否則會報錯
模型化實體Entities
Schema:
Schema schema = new Schema(1, de.greenrobot.daoexample);//第一個參數代表版本,第二個參數代表要產生代碼的包名 預設情況下Dao類與Test類是在一個包下,如果你想分開他們,可以這樣:schema.setDefaultJavaPackageTest(de.greenrobot.daoexample.test); schema.setDefaultJavaPackageDao(de.greenrobot.daoexample.dao); Schema對於Entity還有兩個預設的標誌Flags可以設定:schema2.enableKeepSectionsByDefault(); schema2.enableActiveEntitiesByDefault();
Entity
Schema可以用於添加Entity:
Entity user = schema.addEntity(“User”);
為實體添加屬性:
user.addIdProperty();
user.addStringProperty(“name”);
user.addStringProperty(“password”);
user.addIntProperty(“yearOfBirth”);
為實體添加主鍵
注意:greendao的主鍵支援目前並不完善,還處於開發中,但是我們可以使用下面的方式添加主鍵:
user.addIdProperty().primaryKey().autoIncrement();
關於Java屬性與對應的資料庫表名列名命名的規則與區別
Java中屬性一般採用駝峰命名法。
你可以通過Entity.setTableName修改表名
| 表名/domain類名 |
屬性/列I |
|
| Java |
User |
name |
| 資料庫 |
USER |
NAME |
Inheritance, Interfaces, and Serializable
對於繼承:(不推薦)
myEntity.setSuperclass(“MyCommonBehavior”);
推薦使用介面將一些公用的屬性提取出來。
entityA.implementsInterface(“C”);
entityB.implementsInterface(“C”);
entityB.implementsSerializable();
觸發代碼產生
DaoGenerator daoGenerator = new DaoGenerator();
daoGenerator.generateAll(schema, “../MyProject/src-gen”);
還可以指定第三個參數來將test代碼分開。
Keep sections片段
由於GreenDaoGenerator會在每次運行後覆蓋原有的產生的實體代碼,為了允許添加兵保留你自訂代碼到你的實體當中,greendao使用“keep sections”來允許你添加,但是要先調用Schema的enableKeepSectionsByDefault()或者setHasKeepSections(true) .運行generator之後就會在產生的實體類當中產生如下注釋,我們只需要往這些注釋中添加自訂代碼以後每次運行generator後都會保留這部分代碼。
// 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
不要刪除這些注釋。
SessionsDaoMaster and DaoSession
daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); noteDao = daoSession.getNoteDao();
注意資料庫連接是屬於DaoMaster的,每個Session都需要分配記憶體,對於實體,greendao採用對應的session緩衝cache
Identity scope and session “cache”
greendao預設的行為是多個不同的查詢返回同一個java objects,舉例:從USER表中載入一個ID為42的對象,結果對於每一個查詢都會返回同一個java對象。
另一個作用就是緩衝實體。greendao是用weak reference在記憶體中儲存實體,所以當再次載入時,greendao不會從資料庫載入,而是直接返回該session緩衝中的對象。
注意:一旦需要對其變更,及時你提交到了資料庫,但是緩衝中的對象資料仍然沒有更新,這個時候需要你手動進行更新緩衝中的對象。切記!!!
多表關係映射To-One
相當於外鍵關係。
// The variables user and picture are just regular entities Property pictureIdProperty = user.addLongProperty(pictureId).getProperty(); user.addToOne(picture, pictureIdProperty);
這將導致產生的User實體類中有一個Picture屬性(getPicture/setPicture);
Relation Names and multiple Relations
每一個關聯都有一個名稱。預設情況下關聯的名稱就是目標實體的名稱。所以一般情況下建議主動設定該關聯的名稱以免重名。可以通過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類將多出一個getOrders()List orders = customer.getOrders();
Resolving and Updating To-Many Relations
To-Many解析第一次使用懶載入,但是一旦載入之後to-many list就會被緩衝到一個List當中,後續的請求不會再通過資料庫,而是直接從緩衝中返回,所以一旦修改之後,需要對緩衝中的資料進行更新。
由於緩衝的作用下面的代碼會產生令人困惑的結果:
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);//更新緩衝 對於刪除操作也是一樣的。: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); 然後再產生的程式碼中我們就可以進行導航了:[java] view plaincopyTreeEntity parent = child.getParent(); List grandChildren = child.getChildren();