• 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;
        }
    
    }

    方法出处

  • 相关阅读:
    IO 模型
    进程、线程、锁
    用多线程,实现并发,TCP
    同步锁(互斥锁),GIL锁(解释器层面的锁),死锁与递归锁
    Java项目中的常用的异常2
    JAVA项目中的常用的异常处理情况1
    添加学生信息web界面连接数据库
    jdbc下载路径
    添加学生信息 web界面 并且连接数据库
    正则表达式
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9006957.html
Copyright © 2020-2023  润新知