Android ORM 框架:GreenDao 使用詳解(進階篇)
前言
一、複雜表結構
a, 使用 @ToOne 建立一對一 ( 1 : 1) 關係
@Entity
public class Order {
@Id
private Long id;
private long customerId;
@ToOne(joinProperty = "customerId")
private Customer customer;
}
@Entity
public class Customer {
@Id
private Long id;
}
b,使用 @ToMany 建立一對多 (1:N ) 關係
@Entity
public class Customer {
@Id
private Long id;
@ToMany(referencedJoinProperty = "customerId")
@OrderBy("date ASC")
private List<Order> orders;
}
@Entity
public class Order {
@Id private Long id;
private Date date;
private long customerId;
}
c, 使用@JoinEntity 建立多對多(N : M)關係
@Entity
public class Product {
@Id private Long id;
@ToMany
@JoinEntity(
entity = JoinProductsWithOrders.class,
sourceProperty = "productId",
targetProperty = "orderId"
)
private List<Order> ordersWithThisProduct;
}
@Entity
public class JoinProductsWithOrders {
@Id private Long id;
private Long productId;
private Long orderId;
}
@Entity
public class Order {
@Id private Long id;
}
二、自定義型別
1,GreenDao 預設支援的型別有
boolean, Boolean
int, Integer
short, Short
long, Long
float, Float
double, Double
byte, Byte
byte[]
String
Date
2,通過 @Convert 註解轉換資料型別
例如:將列舉型別轉換成整形
@Entity
public class User {
@Id
private Long id;
@Convert(converter = RoleConverter.class, columnType = Integer.class)
private Role role;
public enum Role {
DEFAULT(0), AUTHOR(1), ADMIN(2);
final int id;
Role(int id) {
this.id = id;
}
}
public static class RoleConverter implements PropertyConverter<Role, Integer> {
@Override
public Role convertToEntityProperty(Integer databaseValue) {
if (databaseValue == null) {
return null;
}
for (Role role : Role.values()) {
if (role.id == databaseValue) {
return role;
}
}
return Role.DEFAULT;
}
@Override
public Integer convertToDatabaseValue(Role entityProperty) {
return entityProperty == null ? null : entityProperty.id;
}
}
三、複雜查詢
a, 條件查詢
方法一:
List<User> joes = userDao.queryRaw("where AGE>?","10");//查詢年齡大於10的使用者
方法二:
List<User> joes = userDao.queryBuilder().where(UserDao.Properties.Age.gt("10")).list();
b, 排序
// order by last name
queryBuilder.orderAsc(Properties.LastName);
// in reverse
queryBuilder.orderDesc(Properties.LastName);
// order by last name and year of birth
queryBuilder.orderAsc(Properties.LastName).orderDesc(Properties.YearOfBirth);
c, 分頁
limit(int) : 限制查詢返回的結果的數量。
offset(int): 設定起始位置
// 從第二條記錄開始查詢5條記錄
List<User> list = userDao.queryBuilder()
.offset(2)
.limit(5)
.list();
d, 懶載入
LazyList<User> lazyList = userDao.queryBuilder().listLazy();
for (User u:lazyList) {
Log.i(TAG, "使用者名稱:"+u.getName());
}
lazyList.close(); //不再使用時必須關閉,否則會導致資料庫遊標未關閉,從而導致記憶體洩漏
LazyList 是 GreenDao 實現的集合類,實現了 List 介面,所以,直接把 LazyList 當做List 來使用即可,
public class LazyList<E> implements List<E>, Closeable {
//省略了具體實現
}
注意: LazyList 不再使用時必須呼叫用 close() 方法關閉,否則會導致記憶體洩漏 。
lazyList.close();
e, 故障查詢
很多時候我們在查詢的時候不能查詢到我們期望的結果,這個時候我們可以通過修改 QueryBuilder 的兩個靜態成員變數來列印 SQL 日誌,便於排查問題。
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
f, 多表聯合查詢
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
queryBuilder.join(Address.class, AddressDao.Properties.userId)
.where(AddressDao.Properties.Street.eq("Sesame Street"));
List<User> users = queryBuilder.list();
四、混淆配置
### 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.**
### greenDAO 2
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
五、資料庫加密
greenDAO 支援 SQLCipher 直接繫結。
a, 引入依賴:
compile 'net.zetetic:android-database-sqlcipher:3.5.7@aar'
b, 初始化加密資料庫
DevOpenHelper helper = new DevOpenHelper(this, "notes-db-encrypted.db");
Database db = helper.getEncryptedWritableDb("<your-secret-password>");
daoSession = new DaoMaster(db).newSession();
c、其他操作和未加密一樣(是不是特別簡單)
當然,如果你不是使用 GreenDao 資料庫,同樣可以使用 SQLCipher 加密保護我們的資料,詳細請參考 SQLCipher for Android
六,整合 RxJava
Rxjava 的火爆程度已經是如日中天了,GreenDao 對當然也是對提供對 Rxjava 的支援。(比較失望的是目前 GreedDao 僅支援 Rxjava 1,不支援 Rxjava 2)
1,引入 Rxjava 依賴
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.2.9'
3,初始化 GreedDao 配置
public class App extends Application {
/**
* 加密識別符號
*/
public static final boolean ENCRYPTED = true;
private DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,ENCRYPTED ? "notes-db-encrypted" : "notes-db");
Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
}
public DaoSession getDaoSession() {
return daoSession;
}
}
3, 獲取 RxDao
User user = new User();
user.setUserId(10);
user.setName("小紅");
user.setAge(18);
DaoSession daoSession = ((MyApp) getApplication()).getDaoSession();
RxDao<User, Long> userDao = daoSession.getUserDao().rx();
userDao.insert(user)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<User>() {
@Override
public void call(User user) {
Log.i(TAG, "儲存成功 ");
}
});
相關推薦
Android ORM 框架:GreenDao 使用詳解(進階篇)
前言 一、複雜表結構 a, 使用 @ToOne 建立一對一 ( 1 : 1) 關係 @Entity public class Order { @Id private Long id; private lo
React Native未來導航者:react-navigation 使用詳解(進階篇)
剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入交流!
史上最簡單MySQL教程詳解(進階篇)之儲存引擎介紹及預設引擎設定
什麼是儲存引擎? 與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著My
hadoop之mapreduce詳解(進階篇)
上篇文章hadoop之mapreduce詳解(基礎篇)我們瞭解了mapreduce的執行過程和shuffle過程,本篇文章主要從mapreduce的元件和輸入輸出方面進行闡述。 一、mapreduce作業控制模組以及其他功能 mapreduce包括作業控制模組,程式設計模型,資料處理引擎。這裡我們重點闡述
Android ORM 框架:GreenDao 使用詳解
一、GreenDao 簡介greenDAO 是一款開源的面向 Android 的輕便、快捷的 ORM 框架,將 Java 物件對映到 SQLite 資料庫中,我們操作資料庫的時候,不在需要編寫複雜的 SQL語句, 在效能方面,greenDAO 針對 Android
Android ORM 框架:GreenDao 資料庫升級
前言 一,GreenDao 預設的升級方式 GreenDao 預設的升級方式是刪除所有舊版,在重新建新表,這樣一來使用者的本地歷史資料則會丟失,這點我們通過DaoMaster 的內部類 DevOpenHelper 原始碼可以瞭解到。
python web框架企業實戰詳解(第六期)\第三課時-css&bootstrap
raw css:<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <
python web框架企業實戰詳解(第六期)\第三課時-ajax&jquery&webpy
main.py__author__ = 'Liao' import web import time urls = ( '/gettime','gettime', '/(.*)', 'hello' ) app = web.application(urls,
python web框架企業實戰詳解(第六期)\第一課時-sorted&if&for
1、元組和列表的區別? 元組:用元括弧括起來的一組元素集合。其特點是內容丌可變,即一旦定義其長度和內容都是固定的;類似於C詢言的陣列。 列表:由中括弧括起來的包含一組元素的集合;其特點是長度和內容都可以改變。可以理解為java中的連結串列陣列。 2、python中分割列表用
python web框架企業實戰詳解(第六期)\第四課時-webpy&django
查詢收集python的IDE,並分析各自優缺點;選擇自己喜歡的IDE搭建各自的webpy和django環境,最後截圖就作業。 PyCharm PyCharm是由JetBrains打造的一款Python IDE。 PyCharm具備一般 Python IDE 的功能,比如:除
python web框架企業實戰詳解(第六期)\第二課時-pickle&__eq__
1、python的值傳遞和引用傳遞區別,哪些型別值傳,哪些是引用傳遞? 值傳遞和引用傳遞區別:依據物件是否可變來確定 和其他語言不一樣,傳遞引數的時候,python不允許程式設計師選擇採用傳值還是傳引用。Python引數傳遞採用的肯定是“傳物件引用”的方式。實際上,這種方式相
docker如何最快速的方式建立映象並在建立時安裝配置好jdk(詳解)(第五篇)共五篇
Dockerfile製作映象步驟 在根目錄下建立dockerfile資料夾 mkdir dockfile 在資料夾下建立Dockerfile檔案 touch Dockerfile 編輯Dockerfile檔案 vim Dockerfile 檔案內容如下: #版本資訊 FROM centos
HenCoder Android 自定義 View 1-7:屬性動畫 Property Animation(進階篇)
這期是 HenCoder 自定義繪製的第 1-7 期:屬性動畫(進階篇) 簡介 上期的內容,對於大多數簡單的屬性動畫場景已經夠用了。這期的內容主要針對兩個方面: 針對特殊型別的屬性來做屬性動畫; 針對複雜的屬性關係來做屬性動畫。 TypeEvaluator
android matrix 最全方法詳解與進階
1 概述 這裡我們會詳細講解matrix的各個方法,以及它的用法。matrix叫做矩陣,在前面講解 ColorFilter 的文章中,我們講解了ColorMatrix,他是一個4*5的矩陣。而這裡,我們講解的Matrix不是用於處理顏色的,而是處理圖形的。他是一個3*3的
OAuth2.0詳解(授權模式篇)
OAuth2.0有五種授權模式。 (1)授權碼模式(Authorization Code) (2)授權碼簡化模式(Implicit) (3)Pwd模式(Resource Owner Password Credentials) (4)Client模式(Cl
學習OpenCV——HoG特徵詳解(特徵點篇)
HOG即histogram of oriented gradient, 是用於目標檢測的特徵描述子,該技術將影象區域性出現的方向梯度次數進行計數,該方法和邊緣方向直方圖、scale-invariant feature transform類似,不同的是hog的計算基於一致空
android canvas layer (圖層)詳解與進階
1 概述 前面的canvas變換文章中,已經粗略的講解過saveLayer的知識,只是圖層的概念沒有詳細的講解。這裡將詳細講解layer。在使用相關方法和flag的時候,先關閉硬體加速。如果需要開啟,參照谷歌官方的硬體加速表格。硬體加速版本 2 save
Jvm堆記憶體的劃分結構和優化,垃圾回收詳解(詳細解答篇)
1.S0與S1的區間明顯較小,有效新生代空間為Eden+S0/S1,因此有效空間就大,增加了記憶體使用率 2.有利於物件代的計算,當一個物件在S0/S1中達到設定的XX:MaxTenuringThreshold值後,會將其分到老年代中,設想一下,如果沒有S0/S1,直接分成兩個區,該如何計算物件經過了多少次G
Android開發之GreenDao(進階篇)
1、資料庫升級 原理:建立臨時表-->刪除原表-->建立新表-->複製臨時表資料到新表並刪除臨時表;這樣就實現資料庫表的更新了 新建一個數據庫更新輔助類 MigrationHelper public class MigrationHelper {
hadoop之yarn詳解(基礎架構篇)
本文主要從yarn的基礎架構和yarn的作業執行流程進行闡述 一、yarn的概述 Apache Yarn(Yet Another Resource Negotiator的縮寫)是hadoop叢集資源管理器系統,Yarn從hadoop 2引入,最初是為了