本文介紹
上一篇講解了GreenDao3.0如何集成環(huán)境與添加各類注解,這一篇我們來看看如何使用GreenDao實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查的功能蚂且,還是上一篇公司Company與雇員Employee的例子。
數(shù)據(jù)庫(kù)初始化
首先初始化數(shù)據(jù)庫(kù)與表涮帘,可封裝一個(gè)工具類豫缨,這里獻(xiàn)上我的:
public class GreenDaoUtil {
private static DaoSession daoSession;
private static SQLiteDatabase database;
/**
* 初始化數(shù)據(jù)庫(kù)
* 建議放在Application中執(zhí)行
*/
public static void initDataBase(Context context) {
//通過DaoMaster的內(nèi)部類DevOpenHelper,可得到一個(gè)SQLiteOpenHelper對(duì)象赶促。
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper
(context, "greendaoutil.db", null); //數(shù)據(jù)庫(kù)名稱
database = devOpenHelper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(database);
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
public static SQLiteDatabase getDatabase() {
return database;
}
}
然后在Application中調(diào)用。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
GreenDaoUtil.initDataBase(getApplicationContext());
}
}
插入
插入公司與雇員的假數(shù)據(jù):
//獲取實(shí)體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);
}
注意:設(shè)置setId(null)挟炬,GreenDao會(huì)自動(dòng)分配自增Id鸥滨。
查詢
由于刪除與更新基本都需要先進(jìn)行查詢嗦哆,所以咱們來看看如何進(jìn)行查詢:
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();
注意:如果查詢調(diào)用.unique()的話婿滓,需注意本次查詢的結(jié)果必須唯一老速,否則會(huì)報(bào)錯(cuò)。where中為查詢條件凸主,支持多條件查詢以" , "隔開橘券。
Query
使用Query可進(jìn)行重復(fù)查詢,更改查詢條件參數(shù)即可卿吐,還是上面的例子旁舰。
//查詢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();
//修改查詢條件參數(shù)
query.setParameter(0, company.getId());
query.setParameter(1, 11000);
List<Employee> employeeList = query.list();
load(Long key)
根據(jù)主鍵查詢一條記錄
Company company = companyDao.load(1l);
loadAll()
查詢表中所有記錄
List<Company> companyList = companyDao.loadAll();
List<Employee> employeeList = employeeDao.loadAll();
原聲sql查詢
推薦通過QueryBuilder和WhereCondition.StringCondition來實(shí)現(xiàn)原聲sql查詢。
Query query = companyDao.queryBuilder()
.where( new StringCondition("_ID IN " + "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)"))
.build();
也可使用queryRaw()或queryRawCreate()方法來實(shí)現(xiàn)但两。
多線程查詢
如果數(shù)據(jù)量過大鬓梅,對(duì)于數(shù)據(jù)庫(kù)查詢的操作是很耗時(shí)的,所以需要開啟新的線程進(jìn)行查詢谨湘。
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判斷值是否相等,通常用來具體查找芥丧,返回一條指定類型數(shù)據(jù)紧阔。
- noteq與eq相反,判斷值是否不等续担,通常用來模糊查找擅耽,返回指定類型的集合。
- like相當(dāng)于通配符查詢物遇,包含查詢值的實(shí)體都會(huì)返回乖仇,同樣模糊查找,返回指定類型的集合询兴。
>乃沙、<、>=诗舰、<=查詢
分別對(duì)應(yīng)方法:
>: gt()
<: lt()
>=: ge()
<=: le()
isNull與isNotNull
為空與不為空警儒,判斷數(shù)據(jù)庫(kù)中有無數(shù)據(jù)。
排序
對(duì)查詢結(jié)果進(jìn)行排序眶根,有升序與降序蜀铲。
List<Employee> employeeList = employeeDao.queryBuilder()
.where(EmployeeDao.Properties.CompanyId.eq(company.getId()))
.orderAsc(EmployeeDao.Properties.Salary)
.list();
上例中的.orderAsc(EmployeeDao.Properties.Salary)
就是對(duì)查詢出來的Employee按工資進(jìn)行升序排序。同理降序?yàn)?code>.orderDesc(EmployeeDao.Properties.Salary)属百。
刪除
刪除主要有三種方式:
deleteBykey(Long key)
根據(jù)key進(jìn)行刪除记劝。舉例:刪除Tencent公司中薪水小于10000的人,需先查詢出Employee表中屬于Tencent公司且薪水小于10000的Employee實(shí)體族扰,再進(jìn)行刪除厌丑。
//查詢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) {
//進(jìn)行刪除
employeeDao.deleteByKey(employee.getId());
}
} else {
Log.e("greendao_test", "delete:deleteList為空");
}
} else {
Log.e("greendao_test", "delete:company為空");
}
delete(Employee entity)
根據(jù)實(shí)體進(jìn)行刪除钳恕。舉例:刪除名為Tencent的公司。
//查詢Company表中名為Tencent的公司
Company companyTencent = companyDao.queryBuilder()
.where(CompanyDao.Properties.CompanyName.eq("Tencent"))
.unique();
companyDao.delete(companyTencent);
deleteAll()
若需刪除表中所有實(shí)體蹄衷,則調(diào)用此方法忧额。舉例:刪除所有雇員。
employeeDao.deleteAll();
更新
若需對(duì)某個(gè)已存入數(shù)據(jù)庫(kù)實(shí)體的屬性進(jìn)行修改愧口,則需進(jìn)行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");
//進(jìn)行更新
employeeDao.update(employee);
}
} else {
Log.e("greendao_test", "update:updateList為空");
}
} else {
Log.e("greendao_test", "update:company為空");
}
總結(jié)
到此,這一篇關(guān)于GreenDao3.0的使用就講解完畢了耍属,可結(jié)合上一篇集成與注解詳解一起看托嚣。
技術(shù)渣一枚,有寫的不對(duì)的地方歡迎大神們留言指正厚骗,有什么疑惑或者不懂的地方也可以在我Github上GreenDaoDemo項(xiàng)目的Issues中提出示启,我會(huì)及時(shí)解答。
附上GreenDaoDemo的地址:
GreenDaoDemo