在了解greenDao之前,我們得了解什么是ORM,ORM Object-Relation-Mapping,對象關系映射,是一種程序設計技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。從效果上來說,它其實是創建了一個可在編程語言里使用的”虛擬對象數據庫”。
面向對象是從軟件工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關系型數據庫則是從數學理論發展而來的。兩者之間是不匹配的,而ORM作為項目中間件形式實現數據在不同場景下數據關系映射,對象關系映射是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。
那么,現在比較流行的有哪些ORM框架呢?
- [OrmLite](http://ormlite.com/)
- [greenDao](http://greendao-orm.com/)
- [Activiteandroid](http://www.activeandroid.com/)
- 其他的
我們今天在這里學習下greenDao的使用。關于greenDao和OrmLite的簡單比較,請點擊[傳送門](http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1127/2066.html)
greenDao設計的主要目標
- 一個精簡的庫
- 性能最大化
- 內存開銷最小化
- 易于使用的API
- 對Android進行高度優化
greenDao設計的主要特點
- greenDao性能遠遠高于同類的OrmLite,
- greenDao支持[protocol buffer(protobuf)](https://github.com/google/protobuf) 協議數據的直接存儲,
- 與OrmLite等使用注解方式的ORM框架不同,greenDao使用Code generation 的方式,這也是其性能提升的原因
接下就看看如何用。
- 在gradle中添加依賴,并修改文件
~~~
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "gl.com.greendaodemo"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets{
main{
java.srcDirs = ['src/main/java','src/main/java-gen']
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'de.greenrobot:greendao:2.0.0'
}
~~~
注意:
~~~
sourceSets{
main{
java.srcDirs = ['src/main/java','src/main/java-gen']
}
}
~~~
這個為新添加的,src/main/文件夾名
- 在與java同級的目錄下新建一個文件夾,理論上名字隨你

- 在項目中建一個Java Library

- 在java library的gradle腳本中添加
~~~
compile 'de.greenrobot:greendao-generator:2.0.0'
~~~
- 在java library中編寫代碼
~~~
public class ExampleDaoGenerator {
public static void main(String[] args) throws Exception{
//自動生成的數據庫版本號,和生成代碼的包路徑
Schema schema = new Schema(2,"gl.com.greendaodemo");
// 當然,如果你愿意,你也可以分別指定生成的 Bean 與 DAO 類所在的目錄,只要如下所示:
// Schema schema = new Schema(1, "me.itangqi.bean");
// schema.setDefaultJavaPackageDao("me.itangqi.dao");
// 模式(Schema)同時也擁有兩個默認的 flags,分別用來標示 entity 是否是 activie 以及是否使用 keep sections。
// schema2.enableActiveEntitiesByDefault();
// schema2.enableKeepSectionsByDefault();
// 一旦你擁有了一個 Schema 對象后,你便可以使用它添加實體(Entities)了。
schema.enableKeepSectionsByDefault();//通過次Schema對象添加的所有實體都不會覆蓋自定義的代碼
addPerson(schema);
// 最后我們將使用 DAOGenerator 類的 generateAll() 方法自動生成代碼,此處你需要根據自己的情況更改輸出目錄(既之前創建的 java-gen)。
// 其實,輸出目錄的路徑可以在 build.gradle 中設置,有興趣的朋友可以自行搜索,這里就不再詳解。
new DaoGenerator().generateAll(schema, "/Users/mac/Desktop/GLandroidstudy/AS/greendaodemo/src/main/java-gen");
}
public static void addPerson(Schema schema){
Entity person = schema.addEntity("Person");
//也可以重新給表命名
// person.setTableName("Person_1");
// greenDAO 會自動根據實體類的屬性值來創建表字段,并賦予默認值
// 接下來你便可以設置表中的字段:
// 與在 Java 中使用駝峰命名法不同,默認數據庫中的命名是使用大寫和下劃線來分割單詞的。
// For example, a property called “creationDate” will become a database column “CREATION_DATE”.
//id自增 name->非空字符串 age-> int 非空
person.addIdProperty();
person.addStringProperty("name").notNull();
person.addIntProperty("age").notNull();
person.addStringProperty("card");
}
}
~~~
小提示:右鍵文件,然后 copy path就可以將文件夾路徑copy出來了。
代碼中有詳細的注釋,就不在多說了。接下來我們回到我們的android工程中,看看我們的工程有什么變化。

給我們生成了這些玩意。我們先暫時不管這些東西。
接下來我們就要實現增刪改查了。想想是不是有點小激動呢。
- 獲得操作數據的dao對象
~~~
// 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 對象。
// 可能你已經注意到了,你并不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO 已經幫你做了。
// 注意:默認的 DaoMaster.DevOpenHelper 會在數據庫升級時,刪除所有的表,意味著這將導致數據的丟失。
// 所以,在正式的項目中,你還應該做一層封裝,來實現數據庫的安全升級。
//實體名小寫+s+"-db"
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"persons-db",null);
db = helper.getWritableDatabase();
Log.e("tag","this is db version ->"+db.getVersion());
// 該數據庫連接屬于DaoMaster,所以多個Session指的是想用的數據庫連接
daoMaster = new DaoMaster(db);
daoSession =daoMaster.newSession();
return daoSession.getPersonDao();
~~~
具體就不解釋了,代碼里有注釋。。
- CURL
增:
~~~
String name_string = name.getText().toString().trim();
int age_int = Integer.parseInt(age.getText().toString().trim());
Person person = new Person(null,name_string,age_int,age_int+"");
Log.e("tag","name-->"+person.getName()+"---"+"age---->"+person.getAge());
dao.insert(person);
NotifyDataSetChanged();
~~~
查and刪
~~~
String name_delate = name.getText().toString().trim();
Query<Person> query = dao.queryBuilder().where(PersonDao.Properties.Name.eq(name_delate))
.build();
List<Person> persons = query.list();
dao.delete(persons.get(0));
NotifyDataSetChanged();
~~~
看看NotifyDataSetChanged()
~~~
private void NotifyDataSetChanged() {
String ageCoulmn =PersonDao.Properties.Age.columnName;
String orderby = ageCoulmn + " COLLATE LOCALIZED ASC";
cursor = db.query(dao.getTablename(),dao.getAllColumns(),
null,null,null,null,orderby);
adapter.swapCursor(cursor);
}
~~~
恩,這次就說這么多把。
代碼地址:[找到greendaoDemo和daoexamplegenerator]即可([https://github.com/Guolei1130/MySelfStudy](https://github.com/Guolei1130/MySelfStudy))
如果大家還有疑問,請移步[泡在網上的日子](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1127/2069.html)
那么,最后,我們來放張效果圖看看。

這一篇只帶來簡單的用法,下一篇將帶給大家更多的用法,如
- 表關聯、以及一些復雜的查詢
- 數據庫升級
- 代碼混淆
- 前言
- Android四大圖片緩存框架之-Fresco(一)
- Android四大圖片緩存框架之-Fresco之initialize(二)
- Android 四大緩存框架之-Universal-Image-Loader
- Android四大圖片緩存框架之-Picasso和Glide
- Android ORM數據庫框架之-greenDao(一)
- Android ORM數據庫框架之-greenDao(二)
- Android ORM數據庫框架之-greenDao(三)
- Android ORM數據庫框架之-greenDao(四)
- Android 網絡開源庫之-retrofit
- RxJava的簡單學習(學習自扔物線)
- Android ORM框架之-ActiveAndroid的簡單分析