編輯:關於Android編程
前面簡單介紹了下GreenDao的使用,從前面的介紹看來是不是覺得有點 so easy。對就是這麼簡單。曾經有位大神說作為一位合格的程序員就要在學習別人的東西時,有點自己的想法。為了表示我是位比較合格的程序員,今天和大家介紹下GreenDao的比較實用的封裝。如果您還沒來得及學習greenDao的實用詳解,請前往GreenDao的使用詳解學習。長話短說我們正式開始介紹。首先我們新建兩個表,分別是Customer和Student表。其生成的文件如下所示。

(一)封裝下DaoMaster,DaoSession,DevOpenHelper對象
其具體代碼如DaoManager.java所示。
package com.jamy.DaoUtils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.jamy.dao.DaoMaster;
import com.jamy.dao.DaoSession;
import de.greenrobot.dao.query.QueryBuilder;
/**
* Created by jamy on 2016/6/16.
* 進行數據庫的管理
* 1.創建數據庫
* 2.創建數據庫表
* 3.對數據庫進行增刪查改
* 4.對數據庫進行升級
*/
public class DaoManager {
private static final String TAG = DaoManager.class.getSimpleName();
private static final String DB_NAME="jamy.db";//數據庫名稱
private volatile static DaoManager mDaoManager;//多線程訪問
private static DaoMaster.DevOpenHelper mHelper;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
private static SQLiteDatabase db;
private Context context;
/**
* 使用單例模式獲得操作數據庫的對象
* @return
*/
public static DaoManager getInstance(){
DaoManager instance = null;
if (mDaoManager==null){
synchronized (DaoManager.class){
if (instance==null){
instance = new DaoManager();
mDaoManager = instance;
}
}
}
return mDaoManager;
}
/**
* 初始化Context對象
* @param context
*/
public void init(Context context){
this.context = context;
}
/**
* 判斷數據庫是否存在,如果不存在則創建
* @return
*/
public DaoMaster getDaoMaster(){
if (null == mDaoMaster){
mHelper = new DaoMaster.DevOpenHelper(context,DB_NAME,null);
mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
}
return mDaoMaster;
}
/**
* 完成對數據庫的增刪查找
* @return
*/
public DaoSession getDaoSession(){
if (null == mDaoSession){
if (null == mDaoMaster){
mDaoMaster = getDaoMaster();
}
mDaoSession = mDaoMaster.newSession();
}
return mDaoSession;
}
/**
* 設置debug模式開啟或關閉,默認關閉
* @param flag
*/
public void setDebug(boolean flag){
QueryBuilder.LOG_SQL = flag;
QueryBuilder.LOG_VALUES = flag;
}
/**
* 關閉數據庫
*/
public void closeDataBase(){
closeHelper();
closeDaoSession();
}
public void closeDaoSession(){
if (null != mDaoSession){
mDaoSession.clear();
mDaoSession = null;
}
}
public void closeHelper(){
if (mHelper!=null){
mHelper.close();
mHelper = null;
}
}
}
DaoManager主要是通過單列模式獲取對應的對象,以及對所有的對象進行初始化。
(二)封裝一可操作不同數據表的公共基類
其集體代碼BaseDao.java所示。
package com.jamy.DaoUtils; import android.content.Context; import android.util.Log; import com.jamy.dao.CustomerDao; import com.jamy.dao.DaoSession; import java.util.List; import de.greenrobot.dao.query.QueryBuilder; /** * 將所有創建的表格相同的部分封裝到這個BaseDao中 * Created by jamy on 16/6/16. */ public class BaseDao(三)讓不同的數據表對象繼承BaseDao{ public static final String TAG = BaseDao.class.getSimpleName(); public static final boolean DUBUG = true; public DaoManager manager; public DaoSession daoSession; public BaseDao(Context context) { manager = DaoManager.getInstance(); manager.init(context); daoSession = manager.getDaoSession(); manager.setDebug(DUBUG); } /**************************數據庫插入操作***********************/ /** * 插入單個對象 * @param object * @return */ public boolean insertObject(T object){ boolean flag = false; try { flag = manager.getDaoSession().insert(object) != -1 ? true:false; } catch (Exception e) { Log.e(TAG, e.toString()); } return flag; } /** * 插入多個對象,並開啟新的線程 * @param objects * @return */ public boolean insertMultObject(final List objects){ boolean flag = false; if (null == objects || objects.isEmpty()){ return false; } try { manager.getDaoSession().runInTx(new Runnable() { @Override public void run() { for (T object : objects) { manager.getDaoSession().insertOrReplace(object); } } }); flag = true; } catch (Exception e) { Log.e(TAG, e.toString()); flag = false; }finally { // manager.CloseDataBase(); } return flag; } /**************************數據庫更新操作***********************/ /** * 以對象形式進行數據修改 * 其中必須要知道對象的主鍵ID * @param object * @return */ public void updateObject(T object){ if (null == object){ return ; } try { manager.getDaoSession().update(object); } catch (Exception e) { Log.e(TAG, e.toString()); } } /** * 批量更新數據 * @param objects * @return */ public void updateMultObject(final List objects, Class clss){ if (null == objects || objects.isEmpty()){ return; } try { daoSession.getDao(clss).updateInTx(new Runnable() { @Override public void run() { for(T object:objects){ daoSession.update(object); } } }); } catch (Exception e) { Log.e(TAG, e.toString()); } } /**************************數據庫刪除操作***********************/ /** * 刪除某個數據庫表 * @param clss * @return */ public boolean deleteAll(Class clss){ boolean flag = false; try { manager.getDaoSession().deleteAll(clss); flag = true; } catch (Exception e) { Log.e(TAG, e.toString()); flag = false; } return flag; } /** * 刪除某個對象 * @param object * @return */ public void deleteObject(T object){ try { daoSession.delete(object); } catch (Exception e) { Log.e(TAG, e.toString()); } } /** * 異步批量刪除數據 * @param objects * @return */ public boolean deleteMultObject(final List objects, Class clss){ boolean flag = false; if (null == objects || objects.isEmpty()){ return false; } try { daoSession.getDao(clss).deleteInTx(new Runnable() { @Override public void run() { for(T object:objects){ daoSession.delete(object); } } }); flag = true; } catch (Exception e) { Log.e(TAG, e.toString()); flag = false; } return flag; } /**************************數據庫查詢操作***********************/ /** * 獲得某個表名 * @return */ public String getTablename(Class object){ return daoSession.getDao(object).getTablename(); } /** * 查詢某個ID的對象是否存在 * @param * @return */ public boolean isExitObject(long id,Class object){ QueryBuilder qb = (QueryBuilder ) daoSession.getDao(object).queryBuilder(); qb.where(CustomerDao.Properties.Id.eq(id)); long length = qb.buildCount().count(); return length>0 ? true:false; } /** * 根據主鍵ID來查詢 * @param id * @return */ public T QueryById(long id,Class object){ return (T) daoSession.getDao(object).loadByRowId(id); } /** * 查詢某條件下的對象 * @param object * @return */ public List QueryObject(Class object,String where,String...params){ Object obj = null; List objects = null; try { obj = daoSession.getDao(object); if (null == obj){ return null; } objects = daoSession.getDao(object).queryRaw(where,params); } catch (Exception e) { Log.e(TAG, e.toString()); } return objects; } /** * 查詢所有對象 * @param object * @return */ public List QueryAll(Class object){ List objects = null; try { objects = (List ) daoSession.getDao(object).loadAll(); } catch (Exception e) { Log.e(TAG,e.toString()); } return objects; } /***************************關閉數據庫*************************/ /** * 關閉數據庫一般在Odestory中使用 */ public void CloseDataBase(){ manager.closeDataBase(); } }
其具體代碼如StudentManager.java以及CustomerManager.java所示(由於本Demo中這兩個Manager比較類似,所以只展示StudentManager.java)。
package com.jamy.DaoUtils; import android.content.Context; import com.jamy.dao.CustomerDao; import com.jamy.entity.Customer; import com.jamy.entity.Student; import java.util.ArrayList; import java.util.List; import de.greenrobot.dao.query.QueryBuilder; /** * Created by jamy on 16/6/16. * 在這個類中添加不同的查詢條件 */ public class StudentManager extends BaseDao針對不同的數據表可以將一些特有的查詢條件放在StudentManager類中(因為不同的數據表可能需要的查詢條件不近相同),這樣方便查詢。{ public StudentManager(Context context) { super(context); } /***************************數據庫查詢*************************/ /** * 通過ID查詢對象 * @param id * @return */ private Student loadById(long id){ return daoSession.getStudentDao().load(id); } /** * 獲取某個對象的主鍵ID * @param student * @return */ private long getID(Student student){ return daoSession.getStudentDao().getKey(student); } /** * 通過名字獲取Customer對象 * @return */ private List getStudentByName(String key){ QueryBuilder queryBuilder = daoSession.getStudentDao().queryBuilder(); queryBuilder.where(CustomerDao.Properties.Name.eq(key)); int size = queryBuilder.list().size(); if (size > 0){ return queryBuilder.list(); }else{ return null; } } /** * 通過名字獲取Customer對象 * @return */ private List getIdByName(String key){ List students = getStudentByName(key); List ids = new ArrayList (); int size = students.size(); if (size > 0){ for (int i = 0;i < size;i++){ ids.add(students.get(i).getId()); } return ids; }else{ return null; } } /***************************數據庫刪除*************************/ /** * 根據ID進行數據庫的刪除操作 * @param id */ private void deleteById(long id){ daoSession.getStudentDao().deleteByKey(id); } /** * 根據ID同步刪除數據庫操作 * @param ids */ private void deleteByIds(List ids){ daoSession.getStudentDao().deleteByKeyInTx(ids); } /*********************************** * 在次添加一些Student特有的數據庫操作語句 * ************************************/ }
(四)將已創建的多表Manager對象封裝在一個類
其具體代碼如DaoUtils.java所示。
package com.jamy.DaoUtils;
import android.content.Context;
import android.util.Log;
import com.jamy.dao.CustomerDao;
import com.jamy.dao.DaoSession;
import com.jamy.dao.StudentDao;
import com.jamy.entity.Customer;
import com.jamy.entity.Student;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.dao.AbstractDao;
import de.greenrobot.dao.query.QueryBuilder;
/**
* Created by jinfangmei on 2016/6/16.
*/
public class DaoUtils{
private static CustomerManager customerManager;
private static StudentManager studentManager;
public static Context context;
public static void init(Context context){
DaoUtils.context = context.getApplicationContext();
}
/**
* 單列模式獲取CustomerManager對象
* @return
*/
public static CustomerManager getCustomerInstance(){
if (customerManager == null) {
customerManager = new CustomerManager(context);
}
return customerManager;
}
/**
* 單列模式獲取StudentManager對象
* @return
*/
public static StudentManager getStudentInstance(){
if (studentManager == null) {
studentManager = new StudentManager(context);
}
return studentManager;
}
}
上面有一點需注意,由於在DaoUtils中的Context是由static修飾,所以這裡的context要用ApplicationContext(防止Activity被結束而造成內存洩漏)。
MainActivity.java的具體代碼如下所示。
package com.jamy.testgreendao;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.jamy.DaoUtils.DaoUtils;
import com.jamy.entity.Customer;
import com.jamy.entity.Student;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mAddButton;
public Button mDeleteButton,mUpdateButton,mQueryButton;
private List
一起學android之如何獲取手機程序列表以及程序相關信息並啟動指定程序
效果圖:程序列表:啟動程序,獲取程序信息: 代碼如下:創建一個AppInfo類來表示應用程序 public cla
Android ActionBar的基本用法
本文翻譯了這篇文章:Using the Android action bar (ActionBar) - Tutorial 1、ActionBar的簡介 ActionB
react native 實戰系列教程之Navigator實現頁面跳轉
主界面開發上一節,我們已經完成了首頁的開發,現在,我們繼續完成主界面的開發,就是添加底部‘首頁’和‘我的’兩個tabbar
Android利用懸浮按鈕實現翻頁效果
今天給大家分享下自己用懸浮按鈕點擊實現翻頁效果的例子。首先,一個按鈕要實現懸浮,就要用到系統頂級窗口相關的WindowManager,WindowManager.Layo