最近使用greendao的过程中,有一个需求:将数据库的内容根据组别展示。意思就是需要将数据库中的所有组别取出来,然后根据组别加载数据。之前我的笨办法是获取所有的数据,然后对得到的数据手动去重(比较每个实体的组别值是否一致,不是就加到一个List集合中)。 
笨办法在数量比较小的数据库里面不会有什么影响,但是为了追求完美,我查询了数据库,得到需要”SELECT DISTINCT”字段才能查询,但是SQLite都不会的我,怎么会查询这个呢?这个时候离成功很近了,不过我还是偷懒了——直接去查询人家是怎么实现的?

private static final String SQL_DISTINCT_ENAME = "SELECT DISTINCT "+EmpDao.Properties.EName.columnName+" FROM "+EmpDao.TABLENAME;

public static List<String> listEName(DaoSession session) {
ArrayList<String> result = new ArrayList<String>();
Cursor c = session.getDatabase().rawQuery(SQL_DISTINCT_ENAME, null);
try{
if (c.moveToFirst()) {
do {
result.add(c.getString());
} while (c.moveToNext());
}
} finally {
c.close();
}
return result;
}

通过这个方法直接就可以实现了,但是这个DaoSession对象不好找,是greendao自动生成的对象,然后在EmpDao里面增加getDaoSession()方法是无效的,一编译就将手动添加的方法删除了。我是在自己的GreenDaoHelper方法里面找到的,代码如下:

/**
* GreenDao多个数据库的支持类
* Created by Administrator on 2017/4/4 0004.
*/ public class GreenDaoHelper { private HashMap<String,DaoSession> hash = new HashMap<String,DaoSession>(); public String pBaseDbPath = "/PuCha2.0/PestGeneralSurvey/PuChaSurvey.db"; private Context pContext; public GreenDaoHelper(Context pContex,String pBaseDbPath){
this.pContext = pContex;
this.pBaseDbPath = pBaseDbPath;
initDatabase(pBaseDbPath);
} /**
* 初始化greenDao,这个操作建议在Application初始化的时候添加;
*/
public DaoSession initDatabase(String pPath) {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(pContext, FormUtil.getInnerSDCardPath()+pPath, null);
SQLiteDatabase db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
DaoMaster mDaoMaster = new DaoMaster(db);
DaoSession mDaoSession = mDaoMaster.newSession();
hash.put(pPath,mDaoSession);
return mDaoSession;
} public DaoSession getDaoSession(String pDbPath) throws FileNotFoundException {
DaoSession mDaoSession = hash.get(pDbPath); if(!fileIsExists(FormUtil.getInnerSDCardPath()+pDbPath)){
throw new FileNotFoundException();
} if(mDaoSession == null){
return initDatabase(pDbPath);
}
return mDaoSession;
} public DaoSession getBaseDaoSession(){
DaoSession mDaoSession = hash.get(pBaseDbPath);
if(mDaoSession == null){
return initDatabase(pBaseDbPath);
}
return mDaoSession;
} public boolean fileIsExists(String pPath){
try{
File f=new File(pPath);
if(!f.exists()){
return false;
}
}catch (Exception e) {
// TODO: handle exception
return false;
}
return true;
} }

方法出处

最新文章

  1. 关于learntorank http://qiita.com/rockhopper/items/bb3d46f01df5f6499123
  2. Parallel 试验
  3. [转]理解RESTful架构
  4. ZOJ3802 Easy 2048 Again (状压DP)
  5. JPush开发
  6. shell的if else 以及大于,小于等逻辑表达式
  7. 关于easyUI在子页面增加显示tabs的一个问题
  8. apache2.2+PHP5.4.28
  9. BootStrap入门_创建第一个例子
  10. html中opacity的使用
  11. 理解JMS规范中消息的传输模式和消息持久化
  12. Mysql高级之主从复制
  13. IOS UI 第五篇:基本UI
  14. JavaSE(十一)之异常处理详解
  15. Oracle:常用的一些基本操作
  16. (视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定
  17. Python爬虫【实战篇】百度翻译
  18. enumerate的用法
  19. 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
  20. PAT L2-013 红色警报(并查集求连通子图)

热门文章

  1. Python使用multiprocessing实现一个最简单的分布式作业调度系统
  2. pcieport 0000:00:1c.5: PCIe Bus Error
  3. 蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举
  4. seafile文档
  5. win8安装iis
  6. [hdu2457]DNA repair(AC自动机+dp)
  7. python如何实现相对导入
  8. 3-3Java程序的结构
  9. Laravel框架之Session操作
  10. UVa 753 A Plug for UNIX (最大流)