本文介紹
上一篇講解了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