Android資料存放區之GreenDao 3.0 詳解(一),androidgreendao
前言:
今天一大早收到GreenDao 3.0 正式發布的訊息,自從2014年接觸GreenDao至今,項目中一直使用GreenDao架構處理資料庫操作,本人使用資料庫路線 Sqlite---->OrmLite---->GreenDao。今天白天一直在忙著公司的項目需求,只能晚上加班來學習最新的GreenDao 3.0使用方式了。
GreenDao 介紹:
greenDAO是一個對象關係映射(ORM)的架構,能夠提供一個介面通過操作對象的方式去操作關係型資料庫,它能夠讓你操作資料庫時更簡單、更方便。如所示:
官網地址:http://greenrobot.org/greendao/
github:https://github.com/greenrobot/greenDAO
GreenDao 優點:
GreenDao 3.0改動:
使用過GreenDao的同學都知道,3.0之前需要通過建立GreenDaoGenerator工程產生Java資料對象(實體)和DAO對象,非常的繁瑣而且也加大了使用成本。
GreenDao 3.0最大的變化就是採用註解的方式通過編譯方式產生Java資料對象和DAO對象。
GreenDao 3.0使用方式: 1.)在build.gradle添加如下配置
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'}2.)建立實體
@Entitypublic class User { @Id private long id; private String name; private int age; //下面省去了 setter/getter}
此時編譯一下自動產生DaoMaster 、DaoSession、Dao, 預設位置:
3.)Gradle 外掛程式配置
比如上面想指定產生DaoMaster 、DaoSession、Dao位置
greendao { targetGenDir 'src/main/java'}
- schemaVersion: 資料庫schema版本,也可以理解為資料庫版本號碼
- daoPackage:設定DaoMaster 、DaoSession、Dao包名
- targetGenDir:設定DaoMaster 、DaoSession、Dao目錄
- targetGenDirTest:設定產生單元測試目錄
- generateTests:設定自動產生單元測試用例
4.)實體@Entity註解
- schema:告知GreenDao當前實體屬於哪個schema
- active:標記一個實體處於活動狀態,活動實體有更新、刪除和重新整理方法
- nameInDb:在資料中使用的別名,預設使用的是實體的類名
- indexes:定義索引,可以跨越多個列
- createInDb:標記建立資料庫表
5.)基礎屬性註解
- @Id :主鍵 long/Long型,可以通過@Id(autoincrement = true)設定自增長
- @Property:設定一個非預設關係映射所對應的列名,預設是的使用欄位名 舉例:@Property (nameInDb="name")
- @NotNul:設定資料庫表當前列不可為空
- @Transient :添加次標記之後不會產生資料庫表的列
6.)索引註解
- @Index:使用@Index作為一個屬性來建立一個索引,通過name設定索引別名,也可以通過unique給索引添加約束
- @Unique:向資料庫列添加了一個唯一的約束
7.)關係註解
- @ToOne:定義與另一個實體(一個實體物件)的關係
- @ToMany:定義與多個實體物件的關係
GreenDao 3.0簡單實戰: 1.)通過上面使用方式我們可以擷取DaoMaster 、DaoSession、Dao類
這裡聲明一個資料庫管理者單例
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; }}2.)擷取可讀可寫資料庫
可讀資料庫
/** * 擷取可讀資料庫 */ 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; }3.)插入資料
/** * 插入一條記錄 * * @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); }4.)刪除資料
/** * 刪除一條記錄 * * @param user */ public void deleteUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.delete(user); }5.)更新資料
/** * 更新一條記錄 * * @param user */ public void updateUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.update(user); }6.)查詢資料
/** * 查詢使用者列表 */ 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; }7.)測試程式
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更為複雜的使用的方式。