greenDAO 3.0

參考文件

ref link
github https://github.com/greenrobot/greenDAO
官網 http://greendao-orm.com/

簡介

greenDAO從3.0版開始使用導入了annotation來建立資料表,比起之前需要另外建立專案方便多了。greenDAO的特性是:效能好(請參考這篇)、快速上手、輕便的程式庫、能對資料庫加密。

範例專案

GreenDaoDemo

生成資料庫

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);

results matching ""

    No results matching ""