前言
最近的項目需要使用到數據庫,本來想用Sqlite數據來做的,但是聽同事說使用Greendao數據庫是真的好用,我就半信半疑的去網上找了下greendao數據庫的資料,以及簡單的使用之后,徹底把我征服了。其實寫數據庫最繁瑣的還是sql語言,而對于我這樣的數據庫小白都可以輕松的使用,實在是太好用了。使用greendao之前我們需要了解的:
認識GreenDao之前必須知道ORM(Object Relation Mapping對象關系映射),其表現形式就是通過GreenDao將數據庫和Bean對象關聯起來,其表現形式如下圖
GreenDao之所以很流行,跟它的優點是息息相關的,從官網中可以看到這樣一張圖,其表示了在主流的ORM第三方庫中,其對數據庫操作的速度是最快的:
不僅如此,其優點還包括有以下幾點
1:存取速度快
2:支持數據庫加密
3:輕量級
4:激活實體
5:支持緩存
6:代碼自動
接入greendao到項目
1:需要在項目(Project)的build.gradle中加入依賴:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath'com.android.tools.build:gradle:2.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
//GreenDao3.2依賴
classpath'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
2:在Moudle的build.gradle文件中添加依賴:
//使用greendao
applyplugin:'org.greenrobot.greendao'
添加依賴(dependencies)中:
//greendao3.2的依賴
compile'org.greenrobot:greendao:3.2.0'
3:添加greendao的數據庫配置:
greendao {
schemaVersion 1 ?//數據庫版本號 每次升級數據庫都需要改變版本,只能增加
daoPackage ?'com.pacgename.greendao.gen' ? //設置DaoMaster、DaoSession、Dao包名
targetGenDir ?'src/main/java' ? ?//設置DaoMaster、DaoSession、Dao目錄
//targetGenDirTest:設置生成單元測試目錄
//generateTests:設置自動生成單元測試用例
}
使用GreenDao數據庫
一:創建Entity類(相當于開發中的Bean類)
greendao采用注解來創建Entity類,創建完成之后build自己的Moudlle,會自動生成:
1:Bean實體的構造方法和get、set方法
2:DaoMaster、DaoSession、DAOS類 ?這里的類生成我們在Moudle的build.gradle中設置的
daoPackage路徑
這里對Bean對象的注釋進行解釋
@Entity:告訴GreenDao該對象為實體,只有被@Entity注釋的Bean類才能被dao類操作
@Id:對象的Id,使用Long類型作為EntityId,否則會報錯。(autoincrement = true)表示主鍵會自增,如果false就會使用舊值
@Property:可以自定義字段名,注意外鍵不能使用該屬性
@NotNull:屬性不能為空
@Transient:使用該注釋的屬性不會被存入數據庫的字段中
@Unique:該屬性值必須在數據庫中是唯一值
@Generated:編譯后自動生成的構造函數、方法等的注釋,提示構造函數、方法等不能被修改
二:創建數據庫和表,初始化數據庫:
public class MyApplication extends Application {
public static ? ?DaoSession ?daoSession;
@Override
public voidonCreate() {
super.onCreate();
setupDatabase();
}
/**
*配置數據庫
*/
private voidsetupDatabase() {
//創建數據庫book.db"
?DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "book.db", null);
//獲取可寫數據庫
SQLiteDatabase db = helper.getWritableDatabase();
//獲取數據庫對象
DaoMaster daoMaster =newDaoMaster(db);
//獲取Dao對象管理者
daoSession= daoMaster.newSession();
}
public staticDaoSessiongetDaoInstant() {
returndaoSession;
}
}
可以發現,GreenDao已經將我們的數據庫創建縮成幾句話,代碼會自動將Bean對象創建成表,不再是傳統的手寫SQL語句。這里的數據庫創建只需要在Application中執行一次即可,這里對幾個類進行解釋
DevOpenHelper:創建SQLite數據庫的SQLiteOpenHelper的具體實現
DaoMaster:GreenDao的頂級對象,作為數據庫對象、用于創建表和刪除表
DaoSession:管理所有的Dao對象,Dao對象中存在著增刪改查等API
由于我們已經創建好了DaoSession和Shop的Bean對象,編譯后會自動生成我們的ShopDao對象,可通過DaoSession獲得
ShopDao dao = daoSession.getBookDao();
這里的Dao(Data Access Object)是指數據訪問接口,即提供了數據庫操作一些API接口,可通過dao進行增刪改查操作
數據庫和表都已經建好了,我們就只需要去操作數據庫了:
三:greendao數據庫的基本操作(增,刪,改,查)
直接附上代碼:
BookDaobookDao;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.query_user).setOnClickListener(this);
findViewById(R.id.insert_user).setOnClickListener(this);
findViewById(R.id.delete_user).setOnClickListener(this);
BookDao bookDao = MyApplication.getDaoInstant().getBookDao();
}
@Override
public voidonClick(View v) {
switch(v.getId()) {
caseR.id.insert_user:
//插入數據 單個的Book對象
bookDao.insertOrReplace(newBook((long)1,"西游記",20,10));
//插入一個List數組? 只要是Iterable的子類都可以插入
List mBookList =newArrayList<>();
mBookList.add(newBook((long)2,"紅樓夢",30,5));
mBookList.add(newBook((long)3,"水滸傳",20,10));
mBookList.add(newBook((long)4,"三國演義",20,10));
mBookList.add(newBook((long)5,"紅樓夢",20,15));
mBookList.add(newBook((long)6,"紅樓西游",20,15));
bookDao.insertOrReplaceInTx(mBookList);
break;
caseR.id.query_user:
//根據查詢Bookname查詢出來,并且更具id排序,最后返回list數組
List books =bookDao.queryBuilder().
where(BookDao.Properties.Bookname.eq("紅樓夢")).
orderDesc(BookDao.Properties.Id).list();
//查詢所有的數據
List list =bookDao.queryBuilder().list();
break;
caseR.id.delete_user:
//根據id刪除數據
bookDao.deleteByKey((long)1);
break;
caseR.id.update_user:
//其實插入可以使用插入InsertorReplace來更新數據? 根據id更新
bookDao.update(newBook((long)1,"西游記",10,20));
break;
}
}
四:greendao數據庫的混淆
在進行打包發布時候,不能混淆掉greendao的類以及數據,在混淆文件中加入下列代碼:
#greendao3.2.0,此是針對3.2.0,如果是之前的,可能需要更換下包名-keepclassorg.greenrobot.greendao.**{*;}
-keepclassmembersclass*extendsorg.greenrobot.greendao.AbstractDao{publicstaticjava.lang.String TABLENAME;
}
-keepclass**$Properties
關于GreenDao的的基本概念與基本操作就講到這里,更多對于GreenDao的數據庫操作還需要多多從實戰中去探索,這里只是一個快速入門的引導.GreenDao高級操作還包括有:多表查詢、多表關聯、session緩存等用法,可以到GreenDao的官網進行學習。