一、首先就是GreenDao環境的集成
GreenDao 地址
Demo包下載地址
環境集成比較簡單,如下
首先在項目下的build.gradle文件中:
//GreenDao3依賴
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
模塊的build.gradle文件中:
apply plugin: 'org.greenrobot.greendao'
//greenDao配置
greendao {
//指定數據庫schema版本號,遷移等操作會用到;
schemaVersion 1
//dao的包名,包名默認是entity所在的包;
daoPackage 'com.gz.greendao'
//生成數據庫文件的目錄;
targetGenDir 'src/main/java'
}
//greendao依賴
implementation 'org.greenrobot:greendao:3.2.2'
二、對GreenDao進行操作的封裝
定義數據庫的實體類
@Entity
public class StudentEntry {
@Id(autoincrement = true) //自增使用Long類型,不能用long
private Long id;
@Property
private String name;
@Property
private String sex;
@Property
private String age;
@Generated(hash = 1678909457) //點擊make project自動生成
public StudentEntry(Long id, String name, String sex, String age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
@Generated(hash = 2045720414)//點擊make project自動生成
public StudentEntry() {
}
}
點擊build下的Make Project後:
會在com.gz.greendao下生成DaoMaster.java、DaoSession.java、以及對應類的Dao文件(StudentEntryDao.java)
三、對數據庫的增刪改查方法進行封裝
1. 首先封裝一個DaoManager文件,進行管理數據庫
public class DaoManager {
private static final String DB_NAME = "student.db";//數據庫名稱
private static DaoManager mDaoManager;
private DaoMaster.DevOpenHelper mHelper;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private Context context;
public DaoManager(Context context) {
this.context = context;
}
/**
* 獲得操作數據庫的對象
* @return
*/
public static DaoManager getInstance(Context context) {
if (mDaoManager == null) {
synchronized (DaoManager.class) {
if (mDaoManager == null) {
mDaoManager = new DaoManager(context);
}
}
}
return mDaoManager;
}
/**
* 獲取DaoSession
*
* @return
*/
public synchronized DaoSession getDaoSession() {
if (null == mDaoSession) {
mDaoSession = getDaoMaster().newSession();
}
return mDaoSession;
}
/**
* 設置debug模式開啓或關閉,默認關閉
*
* @param flag
*/
public void setDebug(boolean flag) {
QueryBuilder.LOG_SQL = flag;
QueryBuilder.LOG_VALUES = flag;
}
/**
* 關閉數據庫
*/
public synchronized void closeDataBase() {
closeHelper();
closeDaoSession();
}
/**
* 判斷數據庫是否存在,如果不存在則創建
*
* @return
*/
private DaoMaster getDaoMaster() {
if (null == mDaoMaster) {
mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
mDaoMaster = new DaoMaster(mHelper.getWritableDb());
}
return mDaoMaster;
}
private void closeDaoSession() {
if (null != mDaoSession) {
mDaoSession.clear();
mDaoSession = null;
}
}
private void closeHelper() {
if (mHelper != null) {
mHelper.close();
mHelper = null;
}
}
}
2. 封裝常用的數據庫操作方法BaseBeanManager
包含基本的增刪改查操作
public class BaseBeanManager<T,K> {
private AbstractDao<T,K> mDao;
public BaseBeanManager(AbstractDao<T, K> mDao) {
this.mDao = mDao;
}
public void save(T item){
mDao.save(item);
}
public void save(T... items){
mDao.insertInTx(items);
}
public void save(List<T> items){
mDao.insertInTx(items);
}
public void update(T item) {
mDao.update(item);
}
public void update(T... items) {
mDao.updateInTx(items);
}
public void update(List<T> items) {
mDao.updateInTx(items);
}
public void saveOrUpdate(T t){
mDao.insertOrReplace(t);
}
public void saveOrUpdate(T... items) {
mDao.insertOrReplaceInTx(items);
}
public void saveOrUpdate(List<T> items) {
mDao.insertOrReplaceInTx(items);
}
public T query(K key){
return mDao.load(key);
}
public List<T> queryAll() {
return mDao.loadAll();
}
public List<T> query(String where, String... params) {
return mDao.queryRaw(where, params);
}
public QueryBuilder<T> queryBuilder() {
return mDao.queryBuilder();
}
public long count() {
return mDao.count();
}
public void refresh(T item) {
mDao.refresh(item);
}
public void detach(T item) {
mDao.detach(item);
}
public void deleteByKey(K key) {
mDao.deleteByKey(key);
}
public void delete(T item) {
mDao.delete(item);
}
public void delete(T... items) {
mDao.deleteInTx(items);
}
public void delete(List<T> items) {
mDao.deleteInTx(items);
}
public void deleteAll() {
mDao.deleteAll();
}
}
3. 創建一個數據庫實體類,就需要創建一個Manager進行管理
public class StudentManager extends BaseBeanManager<StudentEntry,Long> {
public StudentManager(AbstractDao mDao) {
super(mDao);
}
@Override
public QueryBuilder<StudentEntry> queryBuilder() {
return super.queryBuilder();
}
}
4. 創建ManagerFactory,將所有的管理類放在一起
public class ManagerFactory {
/**
* 每一個BeanManager都管理着數據庫中的一個表,我將這些管理者在ManagerFactory中進行統一管理
*/
StudentManager studentManager;
TeacherManager teacherManager;
private static ManagerFactory mInstance = null;
/**
* 獲取DaoFactory的實例
*
* @return
*/
public static ManagerFactory getInstance() {
if (mInstance == null) {
synchronized (ManagerFactory.class) {
if (mInstance == null) {
mInstance = new ManagerFactory();
}
}
}
return mInstance;
}
public synchronized StudentManager getStudentManager() {
if (studentManager == null){
studentManager = new StudentManager(DaoManager.getInstance(MyApplication.getContext()).getDaoSession().getStudentEntryDao());
}
return studentManager;
}
public synchronized TeacherManager getTeacherManager(){
if (teacherManager == null){
teacherManager = new TeacherManager(DaoManager.getInstance(MyApplication.getContext()).getDaoSession().getTeacherEntryDao());
}
return teacherManager;
}
}
5. 簡單使用:
對於具體的查詢,需要在相關的父類進行重寫該方法,這裏StudentManager中重寫了queryBuilder的方法。
//根據名字進行查詢
StudentEntry stu = factory.getStudentManager().queryBuilder()
.where(StudentEntryDao.Properties.Name.eq("張三")).build().unique();