1. 程式人生 > >Android開源:資料庫ORM框架GreenDao學習(三)封裝工具類使用

Android開源:資料庫ORM框架GreenDao學習(三)封裝工具類使用

部落格轉載地址:http://www.it165.net/pro/html/201401/9026.html
        上一篇中講解了基本的增刪改查,本篇繼續講解 QureyBuilder 使用,及工具類封裝使用

  一、使用QureyBuilder實現表的增刪改查

   增刪改查相當方便,完全的面向物件,不需要涉及到任何的sql語言。

  1.查詢

範例1:查詢某個表是否包含某個id:


public boolean isSaved(int ID){

  QueryBuilder<SaveList> qb = saveListDao.queryBuilder();
   qb.where(Properties.Id.eq(ID));
   qb.buildCount().count();
   return qb.buildCount().count() > 0 ? true : false;
}



範例2:獲取整個表的資料集合,一句程式碼就搞定!

public List<PhotoGalleryDB> getPhotoGallery()
{
    return photoGalleryDao.loadAll();// 獲取圖片相簿
}

範例3:通過一個欄位值查詢對應的另一個欄位值(為簡便直接使用下面方法,也許有更簡單的方法,尚未嘗試)

 
/** 通過圖片id查詢其目錄id */
public int getTypeId(int picId)
{
   QueryBuilder<PhotoGalleryDB> qb = photoGalleryDao.queryBuilder();
   qb.where(Properties.Id.eq(picId));
   if (qb.list().size() > 0)
   {
      return qb.list().get(0).getTypeId();
   }else{
      return -1;
   }
}


範例4:查詢所有第一姓名是“Joe”並且以lastname排序。

 
  List joes = userDao.queryBuilder()
  where(Properties.FirstName.eq("Joe"))
  orderAsc(Properties.LastName)
  list();



範例5:多重條件查詢

(1)獲取id為cityId並且infotype為HBContant.CITYINFO_SL的資料集合:


public List<CityInfoDB> getSupportingList(int cityId){
   QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();
   qb.where(qb.and(Properties.CityId.eq(cityId),Properties.InfoType.eq(HBContant.CITYINFO_SL)));
   qb.orderAsc(Properties.Id);// 排序依據
   return qb.list();
}


(2)獲取firstname為“Joe”並且出生於1970年10月以後的所有user集合:

  
  QueryBuilder qb = userDao.queryBuilder();
  qb.where(Properties.FirstName.eq("Joe"),
  qb.or(Properties.YearOfBirth.gt(1970),
  qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
  List youngJoes = qb.list();



範例6:獲取某列物件

 
 picJsonDao.loadByRowId(picId);



2.增添/插入、修改

插入資料更加簡單,也是隻要一句程式碼便能搞定!

 
public void addToPhotoTable(Photo p){
 photoDao.insert(p);
}



插入時需要new一個新的物件,範例如下:

 
  DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
  db = helper.getWritableDatabase();
  daoMaster = new DaoMaster(db);
  daoSession = daoMaster.newSession();
  noteDao = daoSession.getNoteDao();
  Note note = new Note(null, noteText, comment, new Date());
  noteDao.insert(note);



修改更新:


photoDao.insertOrReplace(photo);

photoDao.insertInTx(photo);



3.刪除:

(1)清空表格資料


/** 清空相簿圖片列表的資料 */
public void clearPhoto(){

 photoDao.deleteAll();

}



(2)刪除某個物件

public void deleteCityInfo(int cityId){

  QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();
  DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();
  bd.executeDeleteWithoutDetachingEntities();
}


參考:https://github.com/greenrobot/greenDAO/issues/34

由上可見,使用greenDAO進行資料庫的增刪改查時及其方便,而且效能極佳。

(三)常用方法筆記

1.在Application實現得到DaoMaster和DaoSession的方法:

private static DaoMaster daoMaster;
private static DaoSession daoSession;

/**
* 取得DaoMaster
*
* @param context
* @return
*/
public static DaoMaster getDaoMaster(Context context)
{
   if (daoMaster == null){
     OpenHelper helper = new DaoMaster.DevOpenHelper(context, ontant.DATABASE_NAME, null);
     daoMaster = new DaoMaster(helper.getWritableDatabase());
   }
   return daoMaster;
}

 /**
* 取得DaoSession
*
* @param context
* @return
*/
public static DaoSession getDaoSession(Context context){
   if (daoSession == null){
     if (daoMaster == null){
        daoMaster = getDaoMaster(context);
      }
     daoSession = daoMaster.newSession();
   }
     return daoSession;
}

 

2.增刪改查工具類:

public class DBHelper{

private static Context mContext;
private static DBHelper instance;
 
private CityInfoDBDao cityInfoDao;
 
private DBHelper(){

}
 
public static DBHelper getInstance(Context context){
    if (instance == null){
        instance = new DBHelper();
    if (mContext == null){
        mContext = context;
    }
 
       // 資料庫物件
       DaoSession daoSession = HBApplication.getDaoSession(mContext);
       instance.cityInfoDao = daoSession.getCityInfoDBDao();
   }
    return instance;
}
 
/** 新增資料 */
public void addToCityInfoTable(CityInfo item){
   cityInfoDao.insert(item);
}
 

/** 查詢 */
public List<EstateLoveListJson> getCityInfoList(){
 
   QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();

   return qb.list();
}
 
/** 查詢 */
public List<CityInfo> getCityInfo(){

   return cityInfoDao.loadAll();// 查詢圖片相簿
}
 
/** 查詢 */
public boolean isSaved(int Id){

   QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
   qb.where(Properties.Id.eq(Id));
   qb.buildCount().count();
   return qb.buildCount().count() > 0 ? true : false;// 查詢收藏表
}
 
/** 刪除 */
public void deleteCityInfoList(int Id){
  QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
   DeleteQuery<CityInfo> bd = where(Properties.Id.eq(Id)).buildDelete();
   bd.executeDeleteWithoutDetachingEntities();
}
 
/** 刪除 */
public void clearCityInfo(){
  cityInfoDao.deleteAll();
}
 
/** 通過城市id查詢其型別id */
public int getTypeId(int cityId){
  QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
   qb.where(Properties.Id.eq(cityId));
   if (qb.list().size() > 0){
     return qb.list().get(0).getTypeId();
   }else{
     return 0;
   }
}
 
/** 多重查詢 */
public List<CityInfo> getIphRegionList(int cityId){

  QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();
   qb.where(qb.and(Properties.CityId.eq(cityId), perties.InfoType.eq(HBContant.CITYINFO_IR)));
   qb.orderAsc(Properties.Id);// 排序依據
   return qb.list();
   }
}

另外,還有多表關聯、惰性載入等功能,待後續研究。

參考資料:

1.https://github.com/greenrobot/greenDAO

2.http://greendao-orm.com/documentation/how-to-get-started/

3.http://blog.csdn.net/krislight/article/details/9391455