目前android開發剛學習了一個多月,最近開始研究三方開源框架的用法。瞭解android開發的人應該都會知道,android的數據庫開發主要用到sqlite(若是這點你不清楚,那這篇文章就直接pass吧)。greenDAO應該算是當前最火的數據庫開源框架了吧,它是一個移動開發的ORM(object / relational mapping)框架,至於ORM是什麼,能夠百度之,本人理解也不是很深,大概意思就是爲懶人設計的可以將對象和關係以映射的方式表達出來。greenDAO就是如此:java
greenDAO will do the word for you: it maps Java objects to datebase tables(often called ORM). 這樣開發人員就能夠吧精力集中在軟件開發上,減輕了"wrting sql and parsing query results" 等等這些"quite tedious tasks".android
總之,一句話,greenDAO就是實現Java對象和SQLite Datebase的一個媒介人,簡化了SQLite的操做。git
注:官方網站http://greendao-orm.com/ github
要使用確定要先下載他的軟件包了,官網上有它的鏈接,對於marven和gradle環境直接到serarch.maven.org上下載jar包就行了。sql
下載的jar導入到工程裏面就能夠了,一般都是/libs目錄下。數據庫
(1)generator --- greenDAO-generator.jar app
網上使用說明不多,搜到的都是對於我這個新人來講看的雲裏霧裏,因而本人就乾脆直接看官方文檔,這篇文章也是邊看邊寫的,可能會有些混亂。框架
在github上下載的實例源碼以及上面圖中咱們都會發現,會有一個generator。好比包裏面會有greendao和greendao-generator,示例工程會有DaoExample和DaoExampleGenerator兩個工程。以前一直不明白,看了官方文檔終於理解了。eclipse
「In order to use greenDao in your project, you need to create a second project, the "generator project". 這個額外的工程是一個普通的java工程,而非android工程。它的任務是生成你但願的java對象所對應的DAO接口對象。maven
(2)核心的class -- greenDAO.jar
DAO的core library(greenDAO.jar)中有如下幾個核心類,也是後面比用到的,先來大概瞭解下他們的結構吧,否則直接看他們的使用會雲裏霧裏。
DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase對象以及操做DAO classes(注意:不是對象)。其提供了一些建立和刪除table的靜態方法,其內部類OpenHelper和DevOpenHelper實現了SQLiteOpenHelper並建立數據庫的框架。
DaoSession:會話層。操做具體的DAO對象(注意:是對象),好比各類getter方法。
XXXDao:實際生成的某某DAO類,一般對應具體的java類,好比NoteDao等。其有更多的權限和方法來操做數據庫元素。
XXXEntity:持久的實體對象。一般表明了一個數據庫row的標準java properties。
以下一個實例初始化代碼:
helper = new DaoMaster.DevOpenHelper(this, "notes-db", null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); noteDao = daoSession.getNoteDao();
即:先建立了一個SQLiteOpenHelper並建立鏈接到一個具體數據庫;再根據具體的datebase建立一個master對象用於;最後經過master建立一個數據庫的會話操做。
(1)建立Java工程
(2)導入greenDao-generator.jar和freemarker.jar兩個包。
freemarker是一個用java寫的模板引擎,它可以基於模板來生成文本輸出。應該就是用來自動生成DAO文件的。eclipse下面就是在 properties --> Java build path --> libraries下面導入jar包。
(3)建立schema
這個不知道怎麼業內怎麼翻譯的,暫時先翻譯成」框架「吧。即搭建本身應用的數據庫框架,包括table。
建立schema時須要制定數據庫的版本號、默認的Java package等參數。
Schema schema = new Schema(1, "de.greenrobot.daoexample");
默認Java package用來存放生成的entity、DAO文件、test代碼。但也能夠從新制定test文件的單獨路徑以及DAO文件的路徑,代碼:
schema.setDefaultJavaPackageTest("de.greenrobot.daoexample.test"); schema.setDefaultJavaPackageDao("de.greenrobot.daoexample.dao");
另外,還有兩個flag,用來標示entity是不是activie以及是否使用keep sections。代碼:
schema2.enableKeepSectionsByDefault(); schema2.enableActiveEntitiesByDefault();
Keep sections:由於entity class在每次generator執行時均會覆蓋原來的程序,爲了可以添加用戶自定義代碼到entity中,須要設置該參數。只須要把本身的代碼添加到下面的KEEP[]塊中間就能夠了。
// 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
(4)建立entity
schema中能夠添加entity,簡單的理解應該是entity對應一個具體的java class,entity能夠添加property。Entity一般也是對應一個table。除了添加property以外,entity也能夠添加to-one和to-many關係,即添加一對一的關係和一對多的關係。
下面就直接貼一個官方示例的代碼吧:
public static void main(String[] args) throws Exception { Schema schema = new Schema(3, "de.greenrobot.daoexample"); addNote(schema); new DaoGenerator().generateAll(schema, "../DaoExample/src-gen"); } private static void addNote(Schema schema) { Entity note = schema.addEntity("Note"); note.addIdProperty(); note.addStringProperty("text").notNull(); note.addStringProperty("comment"); note.addDateProperty("date"); }
系統會自動以傳入的參數做爲表的名字,但也能夠自定義表名稱:note.setTableName("NoteTable");
(5)生成DAO文件
生成DAO文件就是使用main函數的最後一句話,其中後面的參數就是但願自動生成的代碼對應的項目路徑。
new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");
注:設置的路徑必須存在,不然會拋出異常。該路徑是另外的工程下面的目錄,固然也能夠本身不這麼作,只要這個目錄存在就行。在schema建立的時候指定的package接口也是相對於該路徑的。
執行generator工程,會發現生成了DaoMaster、DaoSession、NoteDao、Note共4個類文件,Note是一個純Java類,內部各類getter和setter接口均自動建立實現了。NoteDao文件則是建立Note這個表的各個接口,包括sql語句等。很神奇很方便哈!!
完成了generator工做以後後面的東西就簡單了:
(1)建立一個android工程
(2)插入一個Note對象:
DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null); 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); noteDao.deleteByKey(id);
真的是so easy!!