GreenDao的使用

一個將對象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的ORM解決方案。針對Android被高度優(yōu)化,greenDAO提供了極大的性能和消耗最少的內(nèi)存。

**主頁,文檔和支持鏈接:
http://greenrobot.org/greendao/

greenDAO的獨特的特性:

穩(wěn)定:greenDAO一直圍繞2011年以來,用于無數(shù)著名的應用
超級簡單:簡潔而直接的API,在V3與注解
:library<150K,它只是簡單的Java JAR(不依賴CPU本地部分)
快速:可能是最快的ORM為Android,采用智能代碼生成驅動
安全和表現(xiàn)查詢API:QueryBuilder的使用屬性常量來避免錯別字
強大的連接:查詢整個實體,甚至加盟連鎖為復雜的關系
靈活的物業(yè)類型:使用自定義類或枚舉來代表你的實體數(shù)據(jù)
加密:支持SQLCipher加密的數(shù)據(jù)庫

添加greenDAO到項目

配置項目的 build.gradle

buildscript {
   repositories {
   mavenCentral() 
} 
dependencies { 
  classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0' 
  }
}
// 使用數(shù)據(jù)庫升級輔助GreenDaoUpgradeHelper時添加
allprojects { 
  repositories { 
    ... 
  maven { 
    url "https://jitpack.io"
   } 
  }
}

配置模組的 build.gradle

apply plugin: 
'org.greenrobot.greendao'dependencies { 
    compile 'org.greenrobot:greendao:3.2.0' 
    // 數(shù)據(jù)庫加密時添加 
    compile 'net.zetetic:android-database-sqlcipher:3.5.1'
     // 使用數(shù)據(jù)庫升級輔GreenDaoUpgradeHelper時添加
     compile  'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0'
}

設置 Schema,在模組的 build.gradle 中添加:
schemaVersion:數(shù)據(jù)庫schema版本號,通過*OpenHelpers遷移數(shù)據(jù),schema改變值增加。默認為1。

daoPackage:生成DAOs、DaoMaster、DaoSession的包名。默認為entities所在包名。
** targetGenDir**:生成DAOs、DaoMaster、DaoSession的目錄。默認為build/generated/source/greendao generateTests: 設置true自動生成單元測試。 targetGenDirTests: 設置生成單元測試目錄。默認為src/androidTest/java

greendao { 
  schemaVersion 1
 daoPackage 'com.example.greendaodemo.dao'
 targetGenDir 'src/main/java'}

混淆:

### greenDAO 3
-keepclassmembers class  extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
 
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
-dontwarn rx.**

基本用法

初始化

// Application 中執(zhí)行
// DevOpenHelper 每次數(shù)據(jù)庫升級會清空數(shù)據(jù),一般用于開發(fā)
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
 
// 在使用的地方獲取 DAO
NoteDao noteDao = daoSession.getNoteDao();

Dao 增加

long    insert(T entity)  // 插入指定實體
void    insertInTx(T... entities)
void    insertInTx(java.lang.Iterable<t> entities)
void    insertInTx(java.lang.Iterable<t> entities, boolean setPrimaryKey)
long    insertWithoutSettingPk(T entity)  // 插入指定實體,無主鍵
long    insertOrReplace(T entity)  // 插入或替換指定實體
void    insertOrReplaceInTx(T... entities)
void    insertOrReplaceInTx(java.lang.Iterable<t> entities)
void    insertOrReplaceInTx(java.lang.Iterable<t> entities, boolean setPrimaryKey)
void    save(T entity)  // 依賴指定的主鍵插入或修改實體
void    saveInTx(T... entities)
void    saveInTx(java.lang.Iterable<t> entities)

Dao刪除

void    deleteAll()  // 刪除所有
void    delete(T entity)  // 刪除指定的實體
void    deleteInTx(T... entities)
void    deleteInTx(java.lang.Iterable<t> entities)
void    deleteByKey(K key)  // 刪除指定主鍵對應的實體
void    deleteByKeyInTx(K... keys)
void    deleteByKeyInTx(java.lang.Iterable<k> keys)

Dao 修改

void    update(T entity)
void    updateInTx(T... entities)
void    updateInTx(java.lang.Iterable<t> entities)

Dao 其它

void    refresh(T entity)  // 從數(shù)據(jù)庫獲取值刷新本地實體
long    count()  // 數(shù)量
 
boolean     detach(T entity)  // 從域中分離實體
void    detachAll()  // 從域中分離所有實體
 
AbstractDaoSession  getSession()
Database    getDatabase()
java.lang.String    getTablename()
java.lang.String[]  getAllColumns()
java.lang.String[]  getPkColumns()
java.lang.String[]  getNonPkColumns()
Property    getPkProperty()
Property[]  getProperties()

Dao 查詢

loadAll()
T   load(K key)
T   loadByRowId(long rowId)

QueryBuilder 查詢

List datas = userDao.queryBuilder()  // 查詢 User
                .where(Properties.FirstName.eq("zl"))  // 首名為 zl
                .orderAsc(Properties.LastName)  // 末名升序排列
                .list();  // 返回集合
 
// Joe,>= 1970.10
QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("zl"),
                qb.or(Properties.YearOfBirth.gt(1995),
                                qb.and(Properties.YearOfBirth.eq(1995), Properties.MonthOfBirth.ge(10))));
List youngJoes = qb.list();
queryBuilder()  // Dao
 
// QueryBuilder
QueryBuilder<t>     where(WhereCondition cond, WhereCondition... condMore)  // 條件,AND 連接
QueryBuilder<t>     whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  // 條件,OR 連接
QueryBuilder<t>     distinct()  // 去重,例如使用聯(lián)合查詢時
QueryBuilder<t>     limit(int limit)  // 限制返回數(shù)
QueryBuilder<t>     offset(int offset)  // 偏移結果起始位,配合limit(int)使用
QueryBuilder<t>     orderAsc(Property... properties)  // 排序,升序
QueryBuilder<t>     orderDesc(Property... properties)  // 排序,降序
QueryBuilder<t>     orderCustom(Property property, java.lang.String customOrderForProperty)  // 排序,自定義
QueryBuilder<t>     orderRaw(java.lang.String rawOrder)  // 排序,SQL 語句
QueryBuilder<t>     preferLocalizedStringOrder()  // 本地化字符串排序,用于加密數(shù)據(jù)庫無效
QueryBuilder<t>     stringOrderCollation(java.lang.String stringOrderCollation)  // 自定義字符串排序,默認不區(qū)分大小寫
 
WhereCondition  and(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  // 條件,AND 連接
WhereCondition  or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  // 條件,OR 連接

Query 重復查詢

// zl,1995
Query query = userDao.queryBuilder().where(
    Properties.FirstName.eq("zl"), Properties.YearOfBirth.eq(1995)
).build();
List joesOf1970 = query.list();
 
// Maria,1977
query.setParameter(0, "Maria");
query.setParameter(1, 1977);
List mariasOf1977 = query.list();
// QueryBuilder
Query<t>    build()
CursorQuery     buildCursor()
CountQuery<t>   buildCount()
DeleteQuery<t>  buildDelete()
 
// Query
// 設置查詢參數(shù),從 0 開始
Query<t>    setParameter(int index, java.lang.Object parameter)
Query<t>    setParameter(int index, java.lang.Boolean parameter)
Query<t>    setParameter(int index, java.util.Date parameter)
void    setLimit(int limit)  // 限制返回數(shù)
void    setOffset(int offset)  // 偏移結果起始位,配合limit(int)使用
 
// Query 綁定線程,執(zhí)行非本線程的 Query 拋異常,調(diào)用獲取本線程 Query
Query<t>    forCurrentThread()  // 獲取本線程 Query

獲取查詢結果

// QueryBuilder.where() 配合 WhereCondition.StringCondition() 實現(xiàn)SQL查詢
Query query = userDao.queryBuilder()
                .where(new WhereCondition.StringCondition("_ID IN (SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
                .build();
 
// Dao.queryRawCreate() 實現(xiàn)SQL查詢
Query query = userDao.queryRawCreate(  ", GROUP G WHERE G.NAME=? AND T.GROUP_ID=G._ID", "admin");
// Dao
java.util.List<t>   queryRaw(java.lang.String where, java.lang.String... selectionArg)
Query<t>    queryRawCreate(java.lang.String where, java.lang.Object... selectionArg)
Query<t>    queryRawCreateListArgs(java.lang.String where, java.util.Collection<java.lang.object> selectionArg)
 
// WhereCondition.PropertyCondition
PropertyCondition(Property property, java.lang.String op)
PropertyCondition(Property property, java.lang.String op, java.lang.Object value)
PropertyCondition(Property property, java.lang.String op, java.lang.Object[] values)
 
// WhereCondition.StringCondition
StringCondition(java.lang.String string)
StringCondition(java.lang.String string, java.lang.Object value)
StringCondition(java.lang.String string, java.lang.Object... values)</java.lang.object>

DeleteQuery 刪除查詢

DeleteQuery   buildDelete()  // QueryBuilder

查詢?nèi)罩?/h3>
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內(nèi)容

  • greenDao的介紹 greenDao是Android數(shù)據(jù)庫ORM(object/relational mapp...
    K線中有財富密碼閱讀 1,802評論 0 2
  • 最近一段時間,由于項目需要進行優(yōu)化,項目中的數(shù)據(jù)緩存可以說是很混亂,有SqlLite,ActiviteAndroi...
    加油碼農(nóng)閱讀 1,202評論 1 0
  • GreenDao 介紹:greenDAO是一個對象關系映射(ORM)的框架,能夠提供一個接口通過操作對象的方式去操...
    小董666閱讀 740評論 0 1
  • 一、關于greenDAO greenDAO應該算是當前最火的數(shù)據(jù)庫開源框架了,它是一個將對象映射到SQLite數(shù)據(jù)...
    當幸福來敲門58閱讀 13,896評論 3 19
  • 以前開發(fā)用到數(shù)據(jù)庫時,基本上都是用android原生的sql語句,寫那些語句時稍有不慎,就給你拋出一個except...
    BlainPeng閱讀 7,685評論 2 12