文章轉載自:http://my.oschina.net/cheneywangc/blog/196354#OSC_h3_3
瞭解android開發的人應該都會知道,android的數據庫開發主要用到sqlite(如果這點你不清楚,那這篇文章就直接pass吧)。greenDAO應該算是當前最火的數據庫開源框架了吧,它是一個移動開發的ORM(object / relational mapping)框架,至於ORM是什麼,可以百度之,本人理解也不是很深,大概意思就是爲懶人設計的能夠將對象和關係以映射的方式表達出來。greenDAO就是如此:
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".
總之,一句話,greenDAO就是實現Java對象和SQLite Datebase的一個媒介人,簡化了SQLite的操作。
注:官方網站http://greendao-orm.com/
1. 下載greenDAO
要使用肯定要先下載他的軟件包了,官網上有它的連接,對於marven和gradle環境直接到serarch.maven.org上下載jar包就好了。
下載的jar導入到工程裏面就可以了,通常都是/libs目錄下。
2. 前言
(1)generator --- greenDAO-generator.jar
網上使用說明很少,搜到的都是對於我這個新人來說看的雲裏霧裏,於是本人就乾脆直接看官方文檔,這篇文章也是邊看邊寫的,可能會有些混亂。
在github上下載的實例源碼以及上面圖中我們都會發現,會有一個generator。比如包裏面會有greendao和greendao-generator,示例工程會有DaoExample和DaoExampleGenerator兩個工程。之前一直不明白,看了官方文檔終於理解了。
“In order to use greenDao in your project, you need to create a second project, the "generator project". 這個額外的工程是一個普通的java工程,而非android工程。它的任務是生成你希望的java對象所對應的DAO接口對象。
(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。
如下一個實例初始化代碼:
1
2
3
4
5
|
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創建一個數據庫的會話操作。
3. 創建generator工程
(1)創建Java工程
(2)導入greenDao-generator.jar和freemarker.jar兩個包。
freemarker是一個用java寫的模板引擎,它能夠基於模板來生成文本輸出。應該就是用來自動生成DAO文件的。eclipse下面就是在 properties --> Java build path --> libraries下面導入jar包。
(3)創建schema
這個不知道怎麼業內怎麼翻譯的,暫時先翻譯成”框架“吧。即搭建自己應用的數據庫框架,包括table。
創建schema時需要制定數據庫的版本號、默認的Java package等參數。
1
|
Schema schema = new Schema( 1 , "de.greenrobot.daoexample" ); |
默認Java package用來存放生成的entity、DAO文件、test代碼。但也可以重新制定test文件的單獨路徑以及DAO文件的路徑,代碼:
1
2
|
schema.setDefaultJavaPackageTest( "de.greenrobot.daoexample.test" ); schema.setDefaultJavaPackageDao( "de.greenrobot.daoexample.dao" ); |
另外,還有兩個flag,用來標示entity是否是activie以及是否使用keep sections。代碼:
1
2
|
schema2.enableKeepSectionsByDefault(); schema2.enableActiveEntitiesByDefault(); |
Keep sections:因爲entity class在每次generator執行時均會覆蓋原來的程序,爲了能夠添加用戶自定義代碼到entity中,需要設置該參數。只需要把自己的代碼添加到下面的KEEP[]塊中間就可以了。
1
2
3
4
5
6
7
8
|
// 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關係,即添加一對一的關係和一對多的關係。
下面就直接貼一個官方示例的代碼吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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語句等。很神奇很方便哈!!
4. 創建基於greenDao的android工程
完成了generator工作之後後面的東西就簡單了:
(1)創建一個android工程
(2)插入一個Note對象:
1
2
3
4
5
6
7
8
|
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); |
1
|
真的是so easy!! |