Android数据存储之GreenDao 3.0 详解
前言:
?今天一大早收到GreenDao 3.0 正式發(fā)布的消息,自從2014年接觸GreenDao至今,項目中一直使用GreenDao框架處理數(shù)據(jù)庫操作,本人使用數(shù)據(jù)庫路線 Sqlite---->OrmLite---->GreenDao。今天白天一直在忙著公司的項目需求,只能晚上加班來學(xué)習(xí)最新的GreenDao 3.0使用方式了。
GreenDao 介紹:
? ? greenDAO是一個對象關(guān)系映射(ORM)的框架,能夠提供一個接口通過操作對象的方式去操作關(guān)系型數(shù)據(jù)庫,它能夠讓你操作數(shù)據(jù)庫時更簡單、更方便。如下圖所示:
官網(wǎng)地址:http://greenrobot.org/greendao/
github:https://github.com/greenrobot/greenDAO
GreenDao 優(yōu)點:
-
性能高,號稱Android最快的關(guān)系型數(shù)據(jù)庫
- 內(nèi)存占用小
-
庫文件比較小,小于100K,編譯時間低,而且可以避免65K方法限制
-
支持?jǐn)?shù)據(jù)庫加密 ?greendao支持SQLCipher進(jìn)行數(shù)據(jù)庫加密 有關(guān)SQLCipher可以參考這篇博客Android數(shù)據(jù)存儲之Sqlite采用SQLCipher數(shù)據(jù)庫加密實戰(zhàn)
- 簡潔易用的API
GreenDao 3.0改動:
? ?使用過GreenDao的同學(xué)都知道,3.0之前需要通過新建GreenDaoGenerator工程生成Java數(shù)據(jù)對象(實體)和DAO對象,非常的繁瑣而且也加大了使用成本。
GreenDao ?3.0最大的變化就是采用注解的方式通過編譯方式生成Java數(shù)據(jù)對象和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.)新建實體
@Entity public class User {@Idprivate Long id; private String name; private int age; //下面省去了 setter/getter }此時編譯一下自動生成DaoMaster 、DaoSession、Dao,如圖所示 默認(rèn)位置:
3.)Gradle 插件配置
比如上面想指定生成DaoMaster 、DaoSession、Dao位置
greendao {targetGenDir 'src/main/java' }- schemaVersion:?數(shù)據(jù)庫schema版本,也可以理解為數(shù)據(jù)庫版本號
- daoPackage:設(shè)置DaoMaster 、DaoSession、Dao包名
- targetGenDir:設(shè)置DaoMaster 、DaoSession、Dao目錄
- targetGenDirTest:設(shè)置生成單元測試目錄
- generateTests:設(shè)置自動生成單元測試用例
4.)實體@Entity注解
- schema:告知GreenDao當(dāng)前實體屬于哪個schema
- active:標(biāo)記一個實體處于活動狀態(tài),活動實體有更新、刪除和刷新方法
- nameInDb:在數(shù)據(jù)中使用的別名,默認(rèn)使用的是實體的類名
- indexes:定義索引,可以跨越多個列
- createInDb:標(biāo)記創(chuàng)建數(shù)據(jù)庫表
5.)基礎(chǔ)屬性注解
- @Id :主鍵 Long型,可以通過@Id(autoincrement = true)設(shè)置自增長
- @Property:設(shè)置一個非默認(rèn)關(guān)系映射所對應(yīng)的列名,默認(rèn)是的使用字段名 舉例:@Property (nameInDb="name")
- @NotNul:設(shè)置數(shù)據(jù)庫表當(dāng)前列不能為空
- @Transient?:添加次標(biāo)記之后不會生成數(shù)據(jù)庫表的列
6.)索引注解
- @Index:使用@Index作為一個屬性來創(chuàng)建一個索引,通過name設(shè)置索引別名,也可以通過unique給索引添加約束
- @Unique:向數(shù)據(jù)庫列添加了一個唯一的約束
7.)關(guān)系注解
- @ToOne:定義與另一個實體(一個實體對象)的關(guān)系
- @ToMany:定義與多個實體對象的關(guān)系
GreenDao 3.0簡單實戰(zhàn):
? ? ? 1.)通過上面使用方式我們可以獲取DaoMaster 、DaoSession、Dao類
?這里聲明一個數(shù)據(jù)庫管理者單例
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.)獲取可讀可寫數(shù)據(jù)庫
? 可讀數(shù)據(jù)庫
/*** 獲取可讀數(shù)據(jù)庫*/private SQLiteDatabase getReadableDatabase() {if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getReadableDatabase(); return db; }? ?可寫數(shù)據(jù)庫
/*** 獲取可寫數(shù)據(jù)庫*/private SQLiteDatabase getWritableDatabase() {if (openHelper == null) { openHelper = new DaoMaster.DevOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getWritableDatabase(); return db; }3.)插入數(shù)據(jù)
/*** 插入一條記錄** @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.)刪除數(shù)據(jù)
/*** 刪除一條記錄** @param user*/public void deleteUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.delete(user); }5.)更新數(shù)據(jù)
/*** 更新一條記錄** @param user*/public void updateUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.update(user); }6.)查詢數(shù)據(jù)
/*** 查詢用戶列表*/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()); }運行結(jié)果
?
總結(jié):
? ?本文主要介紹了GreenDao 3.0使用注解的情況,以及實現(xiàn)了簡單的增刪改查,接下來會更一步學(xué)習(xí)GreenDao更為復(fù)雜的使用的方式。
干我們這行,啥時候懈怠,就意味著長進(jìn)的停止,長進(jìn)的停止就意味著被淘汰,只能往前沖,直到鳳凰涅槃的一天!轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/7562174.html
總結(jié)
以上是生活随笔為你收集整理的Android数据存储之GreenDao 3.0 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1281. 整数的各位积和之差
- 下一篇: Python 读写操作Excel ——