一個將對象映射到 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;
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;