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

Android ORM之GreenDao學習

編輯:關於Android編程

 

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 plaincopy
Note note = new Note(null, noteText, comment, new Date());  
noteDao.insert(note);  
Log.d(DaoExample, Inserted new note, ID:  + note.getId());  
[java] view plaincopy
noteDao.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  

 

 

不要刪除這些注釋。

 

 

Sessions

DaoMaster 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 plaincopy
TreeEntity parent = child.getParent();  
List grandChildren = child.getChildren(); 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved