1. 程式人生 > >Android ORM 框架:GreenDao 使用詳解(進階篇)

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引入,最初是為了