ORM框架之GreenDao3.0使用詳解(二)

LeiHolmes發表於2019-02-13

本文介紹

  上一篇講解了GreenDao3.0如何整合環境與新增各類註解,這一篇我們來看看如何使用GreenDao實現資料庫增刪改查的功能,還是上一篇公司Company與僱員Employee的例子。
  

資料庫初始化

  首先初始化資料庫與表,可封裝一個工具類,這裡獻上我的:

public class GreenDaoUtil {
    private static DaoSession daoSession;
    private static SQLiteDatabase database;
    /**
     * 初始化資料庫
     * 建議放在Application中執行
     */
    public static void initDataBase(Context context) {
        //通過DaoMaster的內部類DevOpenHelper,可得到一個SQLiteOpenHelper物件。
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper
        (context, "greendaoutil.db", null); //資料庫名稱
        database = devOpenHelper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(database);
        daoSession = daoMaster.newSession();
    }

    public static DaoSession getDaoSession() {
        return daoSession;
    }

    public static SQLiteDatabase getDatabase() {
        return database;
    }
}複製程式碼

  然後在Application中呼叫。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        GreenDaoUtil.initDataBase(getApplicationContext());
    }
}複製程式碼

插入

  插入公司與僱員的假資料:

//獲取實體Dao
CompanyDao companyDao = GreenDaoUtil.getDaoSession().getCompanyDao();
EmployeeDao employeeDao = GreenDaoUtil.getDaoSession().getEmployeeDao();
//插入公司
Company company1 = new Company();
company1.setId(null);
company1.setCompanyName("Netease");
company1.setIndustry("news");
Company company2 = new Company();
company2.setId(null);
company2.setCompanyName("Tencent");
company2.setIndustry("chat");
companyDao.insert(company1);
companyDao.insert(company2);

//插入不同公司的僱員
for (int i = 0; i < 5; i++) {
    Employee employee = new Employee(null, company1.getId(), "Sherlock" + i, 11000 + i * 1000);
    employeeDao.insert(employee);
}
for (int i = 0; i < 5; i++) {
    Employee employee = new Employee(null, company2.getId(), "Richard" + i, 8000 + i * 1000);
    employeeDao.insert(employee);
}複製程式碼

  注意:設定setId(null),GreenDao會自動分配自增Id。

查詢

  由於刪除與更新基本都需要先進行查詢,所以我們們來看看如何進行查詢:

QueryBuilder

  舉例:查詢Tencent公司中薪水大於等於10000的職員。

//查詢Company表中名為Tencent的公司
Company company = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
//查詢Employee表中屬於Tencent公司且薪水水大於等於10000的Employee
List<Employee> employeeList = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()), 
EmployeeDao.Properties.Salary.ge(10000))
.list();複製程式碼

  注意:如果查詢呼叫.unique()的話,需注意本次查詢的結果必須唯一,否則會報錯。where中為查詢條件,支援多條件查詢以” , “隔開。

Query

  使用Query可進行重複查詢,更改查詢條件引數即可,還是上面的例子。

//查詢Company表中名為Tencent的公司
Company company = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
//查詢Employee表中屬於Tencent公司且薪水水大於等於10000的Employee
Query query = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()), 
EmployeeDao.Properties.Salary.ge(10000))
.build();
//修改查詢條件引數
query.setParameter(0, company.getId());
query.setParameter(1, 11000);
List<Employee> employeeList = query.list();複製程式碼

load(Long key)

  根據主鍵查詢一條記錄

Company company =  companyDao.load(1l);複製程式碼

loadAll()

  查詢表中所有記錄

List<Company> companyList = companyDao.loadAll();
List<Employee> employeeList = employeeDao.loadAll();複製程式碼

原聲sql查詢

  推薦通過QueryBuilder和WhereCondition.StringCondition來實現原聲sql查詢。

Query query = companyDao.queryBuilder()
.where( new StringCondition("_ID IN " + "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
.build();複製程式碼

  也可使用queryRaw()或queryRawCreate()方法來實現。

多執行緒查詢

  如果資料量過大,對於資料庫查詢的操作是很耗時的,所以需要開啟新的執行緒進行查詢。

private void queryThread() {
    final Query query = employeeDao.queryBuilder().build();
    new Thread(){
        @Override
        public void run() {
            List list = query.forCurrentThread().list();
        }
    }.start();
}複製程式碼

查詢條件判斷

eq,noteq與like查詢

  eq判斷值是否相等,通常用來具體查詢,返回一條指定型別資料。
  noteq與eq相反,判斷值是否不等,通常用來模糊查詢,返回指定型別的集合。
  like相當於萬用字元查詢,包含查詢值的實體都會返回,同樣模糊查詢,返回指定型別的集合。

>、<、>=、<=查詢

  分別對應方法:
  >: gt()
  <: lt()
  >=: ge()
  <=: le()

isNull與isNotNull

  為空與不為空,判斷資料庫中有無資料。

排序

  對查詢結果進行排序,有升序與降序。

List<Employee> employeeList = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()))
.orderAsc(EmployeeDao.Properties.Salary)
.list();複製程式碼

  上例中的.orderAsc(EmployeeDao.Properties.Salary)就是對查詢出來的Employee按工資進行升序排序。同理降序為.orderDesc(EmployeeDao.Properties.Salary)。  

刪除

  刪除主要有三種方式:

deleteBykey(Long key)

  根據key進行刪除。舉例:刪除Tencent公司中薪水小於10000的人,需先查詢出Employee表中屬於Tencent公司且薪水小於10000的Employee實體,再進行刪除。

//查詢Company表中名為Tencent的公司
Company companyTencent = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
if (companyTencent != null) {
    //查詢Employee表中屬於Tencent公司且薪水小於10000的Employee
    List<Employee> employeeList = employeeDao.queryBuilder()
    .where(EmployeeDao.Properties.CompanyId.eq(companyTencent.getId()), 
    EmployeeDao.Properties.Salary.lt(10000))
    .list();
    if (employeeList != null) {
        for (Employee employee : employeeList) {
            //進行刪除
            employeeDao.deleteByKey(employee.getId());
        }
    } else {
        Log.e("greendao_test", "delete:deleteList為空");
    }
} else {
    Log.e("greendao_test", "delete:company為空");
}複製程式碼

delete(Employee entity)

  根據實體進行刪除。舉例:刪除名為Tencent的公司。

//查詢Company表中名為Tencent的公司
Company companyTencent = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
companyDao.delete(companyTencent);複製程式碼

deleteAll()

  若需刪除表中所有實體,則呼叫此方法。舉例:刪除所有僱員。

employeeDao.deleteAll();複製程式碼

更新

  若需對某個已存入資料庫實體的屬性進行修改,則需進行update操作。舉例:修改Netease公司中薪水小於等於13000人的名字

//查詢Company表中名為Netease的公司
Company companyNetease = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Netease"))
.unique();
if (companyNetease != null) {
    //查詢Employee表中查詢Employee表中屬於Netease公司且薪水小於等於13000人的Employee
    List<Employee> employeeList = employeeDao.queryBuilder()
    .where(EmployeeDao.Properties.CompanyId.eq(companyNetease.getId()), 
    EmployeeDao.Properties.Salary.le(13000))
    .list();
    if (employeeList != null) {
        for (Employee employee : employeeList) {
            //修改屬性
            employee.setEmployeeName("baozi");
            //進行更新
            employeeDao.update(employee);
        }
    } else {
        Log.e("greendao_test", "update:updateList為空");
    }
} else {
    Log.e("greendao_test", "update:company為空");
}複製程式碼

總結

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

相關文章