上一篇講解了GreenDao3.0如何集成環境與添加各種註解,這一篇咱們來看看如何使用GreenDao實現數據庫增刪改查的功能,仍是上一篇公司Company與僱員Employee的例子。
java
首先初始化數據庫與表,可封裝一個工具類,這裏獻上個人:git
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中調用。github
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
GreenDaoUtil.initDataBase(getApplicationContext());
}
}複製代碼
插入公司與僱員的假數據:sql
//獲取實體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。數據庫
因爲刪除與更新基本都須要先進行查詢,因此我們來看看如何進行查詢:多線程
舉例:查詢Tencent公司中薪水大於等於10000的職員。ide
//查詢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可進行重複查詢,更改查詢條件參數便可,仍是上面的例子。ui
//查詢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();複製代碼
根據主鍵查詢一條記錄spa
Company company = companyDao.load(1l);複製代碼
查詢表中全部記錄
List<Company> companyList = companyDao.loadAll();
List<Employee> employeeList = employeeDao.loadAll();複製代碼
推薦經過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與eq相反,判斷值是否不等,一般用來模糊查找,返回指定類型的集合。
like至關於通配符查詢,包含查詢值的實體都會返回,一樣模糊查找,返回指定類型的集合。
分別對應方法:
>: gt()
<: lt()
>=: ge()
<=: le()
爲空與不爲空,判斷數據庫中有無數據。
對查詢結果進行排序,有升序與降序。
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)
。
刪除主要有三種方式:
根據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爲空");
}複製代碼
根據實體進行刪除。舉例:刪除名爲Tencent的公司。
//查詢Company表中名爲Tencent的公司
Company companyTencent = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
companyDao.delete(companyTencent);複製代碼
若需刪除表中全部實體,則調用此方法。舉例:刪除全部僱員。
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