GreenDAO

從很久以前,我就覺得 Android 程式設計師在處理 App 內的資料庫時,對於 SQLite 的處理非常的不直覺,仍然需要瞭解蠻多資料庫的語法,且封裝的程度非常的複雜。

GreenDAO簡介
  1. 是一種 ORM 的框架
  2. 提供介面通過操作對象的方式去操作關聯型資料庫
  3. 效率快速
  4. 體積小,少於100K
GreenDAO 導入
  1. 打開 Android Studio 的 project 的 build.gradle 檔案,並加入以下程式碼
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.1.1'
}
}

2. 打開 app module 的 build.gradle,並加入以下程式碼

apply plugin: 'org.greenrobot.greendao'


dependencies {
compile 'org.greenrobot:greendao:3.1.1'
}

GreenDAO 使用

新增實體

@Entity
public class User {
@Id
private Long id;
private String name;
private int age;
}

Entity : 只要在 Class 前面加上 Entity 描述,則此 Class 可被視為某一資料表的實體結構

Id : 被描述的欄位代表在新增到資料表時會以主鍵的形式存在,若要設定自動增加可改為

@Id(autoincrement = true)

Property:自定在資料表裡的明稱而不使用預設值,例如

@Property(nameInDb='myname')

NotNul:設定此欄位不能為空

當上面的實體設計完成後,按下 AS 的 make project,即會在目錄 /app/build/generated/source/greendao/{package name} 下看到自動生成的檔案,包括 DaoMaster ,DaoSession,以及自己新增的實體 UserDao

新增資料庫管理者

即使使用了 greenDao 了也還是需要自訂一個資料庫管理者的操作對象,這裡建議還是要用 singleton 來實現比較好

public class DBManager {
private final static String DBService = "greendao.db";
private static DBManager mInstance;
private DaoMaster.DevOpenHelper openHelper;
private Context context;

public DBManager(Context context) {
this.context = context;
openHelper = new DaoMaster.DevOpenHelper(context, DBService, null);
}
    public static DBManager getInstance(Context context) {
if (mInstance == null) {
synchronized (DBManager.class) {
if (mInstance == null) {
mInstance = new DBManager(context);
}
}
}
return mInstance;
}
}

取得可寫入的資料庫實體

private SQLiteDatabase getWritableDatabase() {
if (openHelper == null) {
openHelper = new DaoMaster.DevOpenHelper(context, DBService, null);
}
SQLiteDatabase db = openHelper.getWritableDatabase();
return db;
}

針對資料表做 CRUD

DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
// 取得資料表
UserDao userDao = daoSession.getUserDao();
// 插入紀錄
userDao.insert(user);
// 插入陣列
List<User> users = new ArrayList()<>;
userDao.insertInTx(users);
// 刪除紀錄
userDao.delete(user);
// 更新
userDao.update(user);
// 查詢
QueryBuilder<User> query = userDao.queryBuilder();
List<User> userList = query.list();
// 依照特定條件搜尋
query.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age);
List<User> userList = query.list();