編輯:關於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
效果圖:程序列表:啟動程序,獲取程序信息: 代碼如下:創建一個AppInfo類來表示應用程序 public cla
本文翻譯了這篇文章:Using the Android action bar (ActionBar) - Tutorial 1、ActionBar的簡介 ActionB
主界面開發上一節,我們已經完成了首頁的開發,現在,我們繼續完成主界面的開發,就是添加底部‘首頁’和‘我的’兩個tabbar
今天給大家分享下自己用懸浮按鈕點擊實現翻頁效果的例子。首先,一個按鈕要實現懸浮,就要用到系統頂級窗口相關的WindowManager,WindowManager.Layo