標籤:
概述GreenDao是Android當中的高效能ORM架構。(其他的有OrmLite等)項目地址:https://github.com/greenrobot/greenDAO
同時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();
使用樣本:
Note note = new Note(null, noteText, comment, new Date());noteDao.insert(note);Log.d("DaoExample", "Inserted new note, ID: " + note.getId());
noteDao.deleteByKey(id);
資料模型與代碼產生一般情況下,你使用GreeDao需要建立兩個項目,一個是你的Android項目添加greendao.jar依賴,另外一個是普通的java se工程.添加greendao-generator.jar與freemarker.jar依賴。後者用於資料模型domain,dao,DaoMaster等代碼的產生。資料模型代碼產生樣本-使用greendao-generator:
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添加屬性相當於添加列結構。
模型化實體EntitiesSchema:
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();
EntitySchema可以用於添加Entity:
Entity user = schema.addEntity("User");為實體添加屬性:
user.addIdProperty();user.addStringProperty("name");user.addStringProperty("password");user.addIntProperty("yearOfBirth");為實體添加主鍵注意:greendao的主鍵支援目前並不完善,還處於開發中,但是我們可以使用下面的方式添加主鍵:
user.addIdProperty().primaryKey().autoIncrement();
關於Java屬性與對應的資料庫表名列名命名的規則與區別Java中屬性一般採用駝峰命名法。
| |
表名/domain類名 |
屬性/列I |
屬性/列II |
| Java |
User |
name |
myName |
| 資料庫 |
USER |
NAME |
MY_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片段為了允許添加自訂代碼到你的實體當中,greendao使用"keep sections"來允許你添加,但是要先調用Schema的enableKeepSectionsByDefault()或者setHasKeepSections(true) .一旦開啟,這些代碼將會保留進入實體當中。
// 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緩衝中的對象。
注意:一旦需要對其變更,及時你提交到了資料庫,但是緩衝中的對象資料仍然沒有更新,這個時候需要你手動進行更新緩衝中的對象。切記!!!
Android ORM-GreenDao學習之一基礎篇