編輯:關於android開發
今天一大早收到GreenDao 3.0 正式發布的消息,自從2014年接觸GreenDao至今,項目中一直使用GreenDao框架處理數據庫操作,本人使用數據庫路線 Sqlite---->OrmLite---->GreenDao。今天白天一直在忙著公司的項目需求,只能晚上加班來學習最新的GreenDao 3.0使用方式了。
greenDAO是一個對象關系映射(ORM)的框架,能夠提供一個接口通過操作對象的方式去操作關系型數據庫,它能夠讓你操作數據庫時更簡單、更方便。如下圖所示:

官網地址:http://greenrobot.org/greendao/
github:https://github.com/greenrobot/greenDAO
性能高,號稱Android最快的關系型數據庫
庫文件比較小,小於100K,編譯時間低,而且可以避免65K方法限制
支持數據庫加密 greendao支持SQLCipher進行數據庫加密 有關SQLCipher可以參考這篇博客Android數據存儲之Sqlite采用SQLCipher數據庫加密實戰
使用過GreenDao的同學都知道,3.0之前需要通過新建GreenDaoGenerator工程生成Java數據對象(實體)和DAO對象,非常的繁瑣而且也加大了使用成本。
GreenDao 3.0最大的變化就是采用注解的方式通過編譯方式生成Java數據對象和DAO對象。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.0.1'
}
@Entity
public class User {
@Id
private long id;
private String name;
private int age;
//下面省去了 setter/getter
}
此時編譯一下自動生成DaoMaster 、DaoSession、Dao,如圖所示 默認位置:

比如上面想指定生成DaoMaster 、DaoSession、Dao位置
greendao {
targetGenDir 'src/main/java'
}
這裡聲明一個數據庫管理者單例
public class DBManager {
private final static String dbName = "test_db";
private static DBManager mInstance;
private DaoMaster.DevOpenHelper openHelper;
private Context context;
public DBManager(Context context) {
this.context = context;
openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
}
/**
* 獲取單例引用
*
* @param context
* @return
*/
public static DBManager getInstance(Context context) {
if (mInstance == null) {
synchronized (DBManager.class) {
if (mInstance == null) {
mInstance = new DBManager(context);
}
}
}
return mInstance;
}
}
可讀數據庫
/**
* 獲取可讀數據庫
*/
private SQLiteDatabase getReadableDatabase() {
if (openHelper == null) {
openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
}
SQLiteDatabase db = openHelper.getReadableDatabase();
return db;
}
可寫數據庫
/**
* 獲取可寫數據庫
*/
private SQLiteDatabase getWritableDatabase() {
if (openHelper == null) {
openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
}
SQLiteDatabase db = openHelper.getWritableDatabase();
return db;
}
/**
* 插入一條記錄
*
* @param user
*/
public void insertUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.insert(user);
}
/**
* 插入用戶集合
*
* @param users
*/
public void insertUserList(List<User> users) {
if (users == null || users.isEmpty()) {
return;
}
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.insertInTx(users);
}
/**
* 刪除一條記錄
*
* @param user
*/
public void deleteUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.delete(user);
}
/**
* 更新一條記錄
*
* @param user
*/
public void updateUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
userDao.update(user);
}
/**
* 查詢用戶列表
*/
public List<User> queryUserList() {
DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
QueryBuilder<User> qb = userDao.queryBuilder();
List<User> list = qb.list();
return list;
}
/**
* 查詢用戶列表
*/
public List<User> queryUserList(int age) {
DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
QueryBuilder<User> qb = userDao.queryBuilder();
qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age);
List<User> list = qb.list();
return list;
}
DBManager dbManager = DBManager.getInstance(this);
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(i);
user.setAge(i * 3);
user.setName("第" + i + "人");
dbManager.insertUser(user);
}
List<User> userList = dbManager.queryUserList();
for (User user : userList) {
Log.e("TAG", "queryUserList--before-->" + user.getId() + "--" + user.getName() +"--"+user.getAge());
if (user.getId() == 0) {
dbManager.deleteUser(user);
}
if (user.getId() == 3) {
user.setAge(10);
dbManager.updateUser(user);
}
}
userList = dbManager.queryUserList();
for (User user : userList) {
Log.e("TAG", "queryUserList--after--->" + user.getId() + "---" + user.getName()+"--"+user.getAge());
}
運行結果

總結:
本文主要介紹了GreenDao 3.0使用注解的情況,以及實現了簡單的增刪改查,接下來會更一步學習GreenDao更為復雜的使用的方式。
Android手機相冊的布局,android相冊布局
Android手機相冊的布局,android相冊布局實現類似下面的這種布局的方法
2015 Android Dev Summit(安卓開發峰會)第一天,androidsummit
2015 Android Dev Summit(安卓開發峰會)第一天,androidsummit今年的Google I/O沒有抽到票,不能到現場參加。不過11月舉行的An
Android學習指南之二十五:Android動畫的實現 下
本節講解使用SurfaceView組件繪制動畫的方法。SurfaceView類
Linux系統中的知名內核線程(1)——ksoftirqd和events
Linux系統中的知名內核線程(1)——ksoftirqd和eventsLinux系統中的知名內核線程(1)——ksoftirqd和events——lvyilong316