ORM框架之GreenDao3.0整合與註解(一)

LeiHolmes發表於2019-02-27

GreenDao簡介

  GreenDao是一個將物件對映到SQLite資料庫中的輕量且快速的ORM資料庫框架,本文將講解如何整合GreenDao3.0環境,如何使用GreenDao自動生成程式碼及註解的使用。
  
  GreenDao官網
  GreenDao GitHub

GreenDao3.0優勢

  GreenDao相較於ORMLite等其他資料庫框架有以下優勢:
  1. 一個精簡的庫
  2. 效能最大化
  3. 記憶體開銷最小化
  4. 易於使用的 APIs
  5. 對 Android 進行高度優化
  而GreenDao3.0的版本主要使用註解方式定義實體類,通過gradle外掛生成相應的程式碼。相較於3.0之前的版本整合步驟更為便捷,使用起來也更為簡單。本文使用的版本為3.2.0。

整合

專案下build.gradle

  GitHub中提示新增maven倉庫,但是AndroidStudio專案已經預設包含了jcenter倉庫,而jcenter倉庫就是maven倉庫的一個分支,因此不需要再新增倉庫,直接新增classPath即可。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}複製程式碼

app下build.gradle

  在app下build.gradle檔案中我們需要宣告GreenDao外掛,及配置GreenDao生成dao路徑等資訊,宣告GreenDao依賴。

apply plugin: 'org.greenrobot.greendao'

......

greendao {
    schemaVersion 1 //資料庫版本號    
    daoPackage 'com.holmeslei.greendaodemo.database' //設定時生成程式碼的目錄    
    targetGenDir 'src/main/java' //設定DaoMaster、DaoSession、Dao目錄   
    //targetGenDirTest:設定生成單元測試目錄    
    //generateTests:設定自動生成單元測試用例
}

dependencies {
    ......
    compile 'org.greenrobot:greendao:3.2.0'
}複製程式碼

初始化實體

編寫實體類

  整合好使用環境後需要初始化實體,首先編寫實體類。這裡演示使用公司Company與僱員Employer實體例子。使用@Entity註解。莫急,註解機制在之後小節有詳細講解。

@Entity
public class Company {
    @Id(autoincrement = true) //自增
    private Long id; //主鍵
    private String companyName; //公司名稱
    private String industry; //行業
    @ToMany(referencedJoinProperty = "companyId") //設定外來鍵companyId
    private List<Employee> employeeList; //公司與僱員建立一對多關係
}複製程式碼
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id; //主鍵
    private long companyId; //指向Company主鍵
    private String employeeName; //僱員姓名
    private int salary; //薪水
}複製程式碼

生成程式碼

  實體類與註解新增完畢後編譯專案,就會為所有帶註解的實體生成Dao檔案,及DaoMaster與DaoSession。若未在build.gradle中配置過則預設生成目錄為build/generated/source。若配置過則生成在配置的目錄下。

編譯專案
編譯專案

生成程式碼
生成程式碼

註解

  3.0之後最大的不同就是使用的註解來配置實體類屬性,便捷且靈活。下面來看一下各類註解:

實體類註解
@Entity(
        schema = "myschema",
        active = true,       
        nameInDb = "AWESOME_USERS",
        indexes = {
                @Index(value = "name DESC", unique = true)
        },
        createInDb = false
)
public class Company {
    ......
}複製程式碼
  • @Entity:用於標識當前實體需要GreenDao生成程式碼。
  • schema:專案中存在多個Schema時,表明當前實體屬於哪個Schema。
  • active:標記實體是否處於活動狀態,活動狀態才支援更新刪除重新整理等操作。
  • nameInDb:儲存在資料庫中的表名,不寫預設與類名一致。
  • indexes:定義索引,可跨越多個列。
  • createInDb:標記建立資料庫表,若有多個實體關聯此表可設為false避免重複建立,預設為true。
屬性註解
  • @Id :主鍵Long型,可以通過@Id(autoincrement = true)設定自增長。
  • @Property:設定一個非預設關係對映所對應的列名,預設是的使用欄位名例如@Property (nameInDb="name")
  • @NotNul:設定資料庫表當前列不能為空。
  • @OrderBy:指定排序。
  • @Transient:新增此標記之後不會生成資料庫表的列。
  • @Generated:為build之後GreenDao自動生成的註解,為防止重複,每一塊程式碼生成後會加個hash作為標記。
索引註解
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    @Index(unique = true)
    private String industry;
}

@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    @Unique 
    private String employeeName;
}複製程式碼
  • @Index:建立索引,通過設定name設定別名,設定unique新增約束。
  • @Unique:新增唯一約束與(unique = true)作用相同。
關係註解
  • @ToOne:定義與另一實體一對一的關聯。
@Entity
public class Company {
    @Id (autoincrement = true)
    private Long id;
    private long customerId;
    @ToOne(joinProperty = "employeeId")
    private Employee employee;
}

@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private String employeeName;
}複製程式碼
  • @ToMany:定義與多個實體物件一對多的關聯,referencedJoinProperty為外來鍵約束。
  • @JoinProperty:標明目標屬性的源屬性。
  • @JoinEntity:建立表連線關係。
//第一種:Employee實體通過外來鍵companyId指向Company實體的主鍵Id建立一對多關聯
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    private String companyName; 
    private String industry;
    @ToMany(referencedJoinProperty = "companyId")
    private List<Employee> employeeList;
}

@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private long companyId;
    private String employeeName;
    private int salary;
}

//第二種:Employee以companyId為外來鍵,與Company非主鍵不為空的鍵employeeTag建立一對多關聯。
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    private String companyName; 
    private String industry;  
    @ToMany(joinProperties = {
            @JoinProperty(name = "employeeTag", referencedName = "companyId")
    })
    private List<Employee> employeeList;
}

@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private String employeeName;
    private int salary;
    @NotNull 
    private String companyId;
}

//第三種:通過第三者實體類建立關聯,用的較少
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private String employeeName;
    private int salary;

    @ToMany
    @JoinEntity(
            entity = JoinEmployeeToCompany.class,
            sourceProperty = "employeeId",
            targetProperty = "companyId"
    )
    private List<Company> companyList;
}

@Entity
public class JoinEmployeeToCompany {
    @Id(autoincrement = true)
    private Long id;
    private Long employeeId;
    private Long companyId;
}

@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    private String companyName; 
    private String industry;  
}複製程式碼

總結

  到此,這一篇關於GreenDao3.0的整合與註解就講解完畢了,歡迎參看下一篇關於如何使用GreenDao3.0對資料庫進行增刪改查。
  技術渣一枚,有寫的不對的地方歡迎大神們留言指正,有什麼疑惑或者不懂的地方也可以在我Github上GreenDaoDemo專案的Issues中提出,我會及時解答。附上GreenDaoDemo的地址:
  GreenDaoDemo

相關文章