Android ORM之GreenDao學習

來源:互聯網
上載者:User

Android ORM之GreenDao學習
 

GreenDao是Android當中的高效能ORM架構。(其他的有OrmLite等)
 

同時GreenDao還有一個子項目為GreenDao Code Generator:

GreenDao的核心類及其工作如下:

使用初始化

使用greendao添加greendao.jar;
(使用greendao-generator則需要添加greendao-generator.jar與freemarker.jar這一點在以後講)
相關jar包可以通過maven中央倉庫下載。

helper = new DaoMaster.DevOpenHelper(this, notes-db, null);//greendao會建立notes-db這個資料庫  db = helper.getWritableDatabase();  daoMaster = new DaoMaster(db);  daoSession = daoMaster.newSession();  noteDao = daoSession.getNoteDao();  使用樣本:[java] view plaincopyNote note = new Note(null, noteText, comment, new Date());  noteDao.insert(note);  Log.d(DaoExample, Inserted new note, ID:  + note.getId());  [java] view plaincopynoteDao.deleteByKey(id);  
資料模型與代碼產生

完整樣本:

GenConfig.java
import java.io.IOException; import de.greenrobot.daogenerator.*;public class GenConfig{public static void main(String[] args) throws IOException, Exception{Schema schema = new Schema(1, net.xby1993.baiduttstest);   Entity note= schema.addEntity(RSSModel);  note.addIdProperty().primaryKey().autoincrement();  note.addStringProperty(title).notNull();  note.addStringProperty(url);  note.addDateProperty(date);  note.addStringProperty(summary);note.addStringProperty(encoding); new DaoGenerator().generateAll(schema, D:/lucene/src);  //記得保證該目錄必須存在,否則報錯}}

一般情況下,你使用GreeDao需要建立兩個項目,一個是你的Android項目添加greendao.jar依賴,另外一個是普通的java se工程.添加greendao-generator.jar與freemarker.jar依賴。後者用於資料模型domain,dao,DaoMaster等代碼的產生。
DoMaster與DaoSession及XxxDao以及實體類均會產生。DoMaster與DaoSession對應於你當前的資料模型。這兩個類中每個資料模型產生的方法均不同
資料模型代碼產生樣本-使用greendao-generator:

GenConfig.java
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(); 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.