GreenDao 是一個(gè)將對(duì)象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案摇幻。
性能(官網(wǎng)上的解釋)
我們知道所有的ORM的颓芭,greenDAO是最快的顷锰。greenDAO不作性能方面任何妥協(xié)。數(shù)據(jù)庫是非常適合存儲(chǔ)大量數(shù)據(jù)亡问,從而加速事項(xiàng)官紫。使用greenDAO,大多數(shù)實(shí)體可以插入州藕,更新和在速率加載每秒幾千實(shí)體万矾。我們?cè)趃reenDAO的表現(xiàn)充滿信心,并邀請(qǐng)您比較greenDAO對(duì)其他的框架慎框。我們開源了我們的測(cè)試充分的透明度良狈。下圖比較了Android的greenDAO,OrmLite和ActiveAndroid 3個(gè)最流行的ORM解決方案(根據(jù)基于GitHub上星和Appbrain的統(tǒng)計(jì)普及)笨枯。greenDAO插入和更新實(shí)體快約2倍薪丁,并圍繞比ORMLite快4倍的負(fù)載實(shí)體遇西。典型應(yīng)用的加載速度是最相關(guān)的。
一严嗜、GreenDao配置
- 配置項(xiàng)目的build.gradle
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
配置位置如圖:
2.配置Model的build.gradle
1)添加第一處
apply plugin: 'org.greenrobot.greendao'
2)添加第二處
compile 'org.greenrobot:greendao:3.2.2'
compile 'org.greenrobot:greendao-generator:3.2.2'
3)添加第三處
greendao {
//指定數(shù)據(jù)庫schema版本號(hào)粱檀,遷移等操作會(huì)用到
schemaVersion 3
//DaoSession、DaoMaster以及所有實(shí)體類的dao生成的目錄,默認(rèn)為你的entity所在的包名
//daoPackage 包名
daoPackage 'com.example.tianmei.myapplication.greendao.gen'
//這就是我們上面說到的自定義生成數(shù)據(jù)庫文件的目錄了漫玄,可以將生成的文件放到我們的java目錄中茄蚯,而不是build中,這樣就不用額外的設(shè)置資源目錄了
//工程路徑
targetGenDir 'src/main/java'
}
配置位置如圖:
3.編寫entity類睦优,創(chuàng)建實(shí)體類
//@Entity 將我們的java普通類變?yōu)橐粋€(gè)能夠被greenDAO識(shí)別的數(shù)據(jù)庫類型的實(shí)體類
@Entity
public class Person {
//@Id:通過這個(gè)注解標(biāo)記的字段必須是Long類型的渗常,這個(gè)字段在數(shù)據(jù)庫中表示它就是主鍵,并且它默認(rèn)就是自增的
@Id
private int Id;
private String UserName;
private String PassWord;
//@Transient:表明這個(gè)字段不會(huì)被寫入數(shù)據(jù)庫汗盘,只是作為一個(gè)普通的java類字段皱碘,用來臨時(shí)存儲(chǔ)數(shù)據(jù)的,不會(huì)被持久化
@Transient
private String Mobile; // not persisted
}
注:
@Id注解選擇 long / Long 屬性作為實(shí)體ID隐孽。在數(shù)據(jù)庫術(shù)語中癌椿,它是主鍵。參數(shù)自動(dòng)增量菱阵,是使ID值不斷增加(不會(huì)選用舊值)的標(biāo)志踢俄。
@Property讓你定義一個(gè)非默認(rèn)的列名,其屬性映射到晴及。如果不存在都办,greenDAO將在SQL雜交方式使用字段名(大寫,下劃線抗俄,而不是駱駝情況下脆丁,例如 customName將成為 CUSTOM_NAME)。注意:您目前只能使用內(nèi)聯(lián)常量來指定列名动雹。
@NotNull makes the property a “NOT NULL” column on the database side槽卫。通常是有意義的紀(jì)念原始類型(long, int, short, byte)與@NotNull,同時(shí)具有包裝類(Long, Integer, Short, Byte)空的值胰蝠。
@Transient表明這個(gè)字段不會(huì)被寫入數(shù)據(jù)庫歼培,只是作為一個(gè)普通的java類字段,用來臨時(shí)存儲(chǔ)數(shù)據(jù)的茸塞,不會(huì)被持久化
@Entity 定義實(shí)體
@nameInDb 在數(shù)據(jù)庫中的名字躲庄,如不寫則為實(shí)體中類名
@indexes 索引
@createInDb 是否創(chuàng)建表,默認(rèn)為true,false時(shí)不創(chuàng)建
@schema 指定架構(gòu)名稱為實(shí)體
@active 無論是更新生成都刷新
@Id
@NotNull 不為null
@Unique 唯一約束
@ToMany 一對(duì)多
@OrderBy 排序
@ToOne 一對(duì)一
@Transient 不存儲(chǔ)在數(shù)據(jù)庫中
@generated 由greendao產(chǎn)生的構(gòu)造函數(shù)或方法
4.MakeProject 編譯項(xiàng)目钾虐,User實(shí)體類會(huì)自動(dòng)編譯噪窘,生成get、set方法并且會(huì)在com.example.tianmei.myapplication.greendao.gen
二效扫、GreenDao使用
- 聲明屬性
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private PersonDao personDao;
public static BlankFragment1 instances;
- 初始化greenDao方法
DaoMaster:使用greenDAO的切入點(diǎn)倔监。 DaoMaster保存數(shù)據(jù)庫對(duì)象(SQLiteDatabase)并管理特定模式的DAO類(而不是對(duì)象)直砂。它有靜態(tài)方法來創(chuàng)建表或刪除它們。它的內(nèi)部類OpenHelper和DevOpenHelper是SQLiteOpenHelper實(shí)現(xiàn)浩习,在SQLite數(shù)據(jù)庫中創(chuàng)建模式静暂。
DaoSession:管理特定模式的所有可用DAO對(duì)象,您可以使用其中一個(gè)getter方法獲取谱秽。 DaoSession還為實(shí)體提供了一些通用的持久性方法洽蛀,如插入,加載疟赊,更新郊供,刷新和刪除。最后听绳,DaoSession對(duì)象也跟蹤標(biāo)識(shí)范圍颂碘。
DAO:數(shù)據(jù)訪問對(duì)象(DAO)持續(xù)并查詢實(shí)體异赫。對(duì)于每個(gè)實(shí)體椅挣,greenDAO生成DAO。它具有比DaoSession更多的持久化方法塔拳,例如:count鼠证,loadAll和insertInTx。
實(shí)體:持久對(duì)象靠抑。通常量九,實(shí)體是使用標(biāo)準(zhǔn)Java屬性(如POJO或JavaBean)表示數(shù)據(jù)庫行的對(duì)象。
/**
* 設(shè)置greenDao
*/
private void setDatabase() {
// 通過 DaoMaster 的內(nèi)部類 DevOpenHelper颂碧,你可以得到一個(gè)便利的 SQLiteOpenHelper 對(duì)象荠列。
// 可能你已經(jīng)注意到了,你并不需要去編寫「CREATE TABLE」這樣的 SQL 語句载城,因?yàn)?greenDAO 已經(jīng)幫你做了肌似。
// 注意:默認(rèn)的 DaoMaster.DevOpenHelper 會(huì)在數(shù)據(jù)庫升級(jí)時(shí),刪除所有的表诉瓦,意味著這將導(dǎo)致數(shù)據(jù)的丟失川队。
// 所以,在正式的項(xiàng)目中睬澡,你還應(yīng)該做一層封裝固额,來實(shí)現(xiàn)數(shù)據(jù)庫的安全升級(jí)。
mHelper = new DaoMaster.DevOpenHelper(getActivity(), "notes-db", null);
db = mHelper.getWritableDatabase();
// 注意:該數(shù)據(jù)庫連接屬于 DaoMaster煞聪,所以多個(gè) Session 指的是相同的數(shù)據(jù)庫連接斗躏。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public static BlankFragment1 getInstances(){
return instances;
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
- 在主方法中調(diào)用
//設(shè)置greenDao
setDatabase();
- 獲取Person對(duì)象
personDao = getDaoSession().getPersonDao();
三、用法(增刪改查操作)
1昔脯、插入數(shù)據(jù)
//新建一個(gè)對(duì)象
Person person = new Person(null, "sc", "123");
//插入
personDao.insert(person);
2啄糙、查找數(shù)據(jù)
List<Person> personList = personDao.queryBuilder()
.where(PersonDao.Properties.Id.notEq(999))
.orderAsc(PersonDao.Properties.Id)
.limit(5)
.build().list();
3馋艺、修改數(shù)據(jù)
//1.where是查詢條件,
//2.unique()表示查詢結(jié)果為一條數(shù)據(jù)迈套,若數(shù)據(jù)不存在捐祠,findUser為null。
Person person = personDao.queryBuilder().where(PersonDao.Properties.UserName.eq("sc")).build().unique();
if(person != null) {
person.setUserName("lm");
// update為更新
personDao.update(person);
Toast.makeText(getActivity(), "修改成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "用戶不存在", Toast.LENGTH_SHORT).show();
}
4桑李、刪除數(shù)據(jù)
Person person = personDao.queryBuilder().where(PersonDao.Properties.UserName.eq("sc")).build().unique();
if(person != null){
//通過Key來刪除踱蛀,這里的Key就是user字段中的ID號(hào)
personDao.deleteByKey(person.getId());
}