greenDAO 3.0
參考文件
ref | link |
---|---|
github | https://github.com/greenrobot/greenDAO |
官網 | http://greendao-orm.com/ |
簡介
greenDAO從3.0版開始使用導入了annotation來建立資料表,比起之前需要另外建立專案方便多了。greenDAO的特性是:效能好(請參考這篇)、快速上手、輕便的程式庫、能對資料庫加密。
範例專案
生成資料庫
1. gradle
在root project 中的 build.gradle裡輸入:
repositories {
mavenCentral()
}
dependencies {
...
classpath 'org.greenrobot:greendao-gradle-plugin:3.1.1'
...
}
在app 中的 build.gradle裡輸入:
apply plugin: 'org.greenrobot.greendao'
dependencies {
...
compile 'org.greenrobot:greendao:3.1.1'
...
}
要注意 apply plugin 一定要在gradle 檔的最上方
2. 建立 Entity
要操作資料庫的話首先我們必須建立 DB schema,也就是要用來儲存以及讀取的資料, 在這裡我們只需要在 class 的開頭加上 @Entity 就能藉由greenDAO 的 plugin 來幫我們生成DAO程式碼。
在這個例子中建立了一個名稱為 student 的 entity
@Entity
public class Student {
@Id(autoincrement = true)
private Long id;
@NonNull
private String name;
}
點擊"Make Project"
生成的程式碼會在 app -> build -> generated -> source -> greendao
3. 建立一個DBService or DBHelper(建議使用,DB操作要singleton才安全)
以下程式碼可以根據自己喜好修改,不一定要寫成這樣
public class DBService {
private static final String DB_NAME = "greedDaoDemo.db";
private DaoSession daoSession;
public void init(Context context) {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME);
DaoMaster daoMaster = new DaoMaster(helper.getWritableDatabase());
daoSession = daoMaster.newSession();
}
public StudentDao getStudentDao(){
return daoSession.getStudentDao();
}
}
在 Application 初始化
public class GreenDaoApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
DBService dbService = ServiceFactory.getDbService();
dbService.init(this);
}
}
4. 各種簡單操作(建議不要在mainthread上執行)
insert
Student student = studentFactory.generateStudent();
long id = studentDao.insert(student);
loadAll
List<Student> students = studentDao.loadAll();
update
studentDao.update(student);
delete
studentDao.delete(student);
跟據id取資料
Student student = studentDao.load(id);
查詢資料
greenDAO設計了一個QueryBuilder的類別,用來做簡單且通用的查詢
1. 查詢所有姓王的學生
QueryBuilder<Student> studentQueryBuilder = studentDao.queryBuilder();
Property nameProperty = StudentDao.Properties.Name;
List<Student> wangStudents = studentQueryBuilder.where(nameProperty.like("王%"))
.list();
2. 查詢某一天的所有資料( 該筆資料含有日期欄位)
private <T> List<T> queryOneDayData(QueryBuilder<T> builder, Property dateProperty, Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
Date today = calendar.getTime();
calendar.add(Calendar.DAY_OF_MONTH,1);
Date nextDay = calendar.getTime();
List<T> queryList = builder.where(builder.and(dateProperty.ge(today), dateProperty.lt(nextDay))).list();
return queryList;
}
3. 依據某個欄位做排序
QueryBuilder<Student> studentQueryBuilder = studentDao.queryBuilder();
Property ageProperty = StudentDao.Properties.Age;
List<Student> orderedStudents = studentQueryBuilder.orderAsc(ageProperty)
.list();
4. Raw Query
如果不幸的QueryBuilder無法做到想要的查詢,可以直接拿Database instance,至於如何使用Cursor這邊就不多加描述了
SQLiteDatabase db = daoSession.getDatabase();
Cursor cursor = db.rawQuery("SELECT SUM(x_pos) FROM point WHERE .....", null);