zoukankan      html  css  js  c++  java
  • greendao 查询之数据去重

    最近使用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(0));
                } 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;
        }
    
    }

    方法出处

  • 相关阅读:
    【codecombat】 试玩全攻略 第九关 循环又循环
    【codecombat】 试玩全攻略 第十三关 已知敌人
    【codecombat】 试玩全攻略 第十一关 再次迷宫经历
    【codecombat】 试玩全攻略 第六关 cell commentary
    【codecombat】 试玩全攻略 第八关 火舞
    【codecombat】 试玩全攻略 第十二关 恐惧之门
    【codecombat】 试玩全攻略 第十四关 已知敌人
    苹果apns推送总结
    Xcode 提升速度小技巧
    UITextField 限制输入字数
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9006957.html
Copyright © 2011-2022 走看看