首页 > 学院 > 开发设计 > 正文

数据库根据设定的数据量上限获取非相同的数据列表

2019-11-09 13:32:38
字体:
来源:转载
供稿:网友

在做一个项目时,遇到一个问题:易英健每分钟会记录一比数据,需要用手机扫描,获取此数据,但每次携带过来的数据就会有重复得数据,数据需要每次的重复插入,而每次的更新数量较少(1min一笔),且后续得数据量稍大(存满会有每次读取4k笔数据),这样就会有重复的数据很多,这样可能会大量的占用内存,减少读取的速度现在有一个方法能稍作缓解(后续可能会更新删除重复数据的方法),目前采用的是查询非重复的数据。

用的是android手机所以都是java代码,其中数据库的查询方法用的是android自带得sql。难点部分就是查询部分得筛选,以及删除多余数据库的操作(但并不是删除重复数据的方法)。

首先是查询部分(插入部分不做解释)

/**     * 查找uid对应的所有的温度数据     *     * @param context db     * @param uid     唯一码     * @return     */    public ArrayList<TagTemperature> queryAll(Context context, String uid) {        try {            SQLiteDatabase db = DatabaseHelper.getDatabaseHelper(context).getWritableDatabase();            //数据集合            ArrayList<TagTemperature> mDatas = new ArrayList<>();            //根据uid筛选出所需要的数据            String selection = "uid=?";            String[] selectionArgs = {uid};            //根据DateTime筛选出非重复数            String groupBy = "DateTime";            String having = null;            //查询            Cursor c = db.query(true, TABLE, null, selection, selectionArgs, groupBy, having, "DateTime" + " DESC", null);//            Cursor c = db.query(false, TABLE, null, null, null, null, null, "DateTime" + " DESC", null);            int size = c.getCount();            int id = 0;            while (c.moveToNext()) {                if (c.getPosition() < 50) {//只选择50笔数据,可调节数值,此处为限定的查询的数据上限                    TagTemperature data = cursorToValue(c);                    mDatas.add(data);                } else {                    //跳出循环,cursor不动                    break;                }                id = c.getInt(c.getColumnIndex("id"));            }            LogUtil.info(TAG, "size: " + size + " position: " + c.getPosition());            LogUtil.info(TAG, "DateTime: " + mDatas.get(mDatas.size() - 1).getDate());            //获得主键,根据主键删除超出筛选查询的部分            LogUtil.info(TAG, "id: " + id);            //删除50以前的数据            deleteTBTemperatureLim(context, id);            c.close();            db.close();            return mDatas;        } catch (Exception e) {            e.PRintStackTrace();            return null;        }    }

 
然后是deleteTBTemperatureLim(context,id)方法

/**     * 删除标签50条左右的温度数据     *     * @param context     */    public boolean deleteTBTemperatureLim(Context context, int id) {        try {            //根据时间筛选数据库中的数据            SQLiteDatabase db = DatabaseHelper.getDatabaseHelper(context).getWritableDatabase();            String whereClause = "id<?";            db.delete(TABLE, whereClause, new String[]{"" + id});            //查询数据            Cursor cd = db.query(false, TABLE, null, null, null, null, null, "DateTime" + " DESC", null);            LogUtil.info(TAG, "size: " + cd.getCount());            //若是表单中本来就没有重复数据,可直接使用词语法,删除想要的上限数据            //sql = "delete from " + TABLE + " where id <= (select max(id) - 50from " + TABLE + ")";            //db.execSQL(sql);            return true;        } catch (Exception e) {            e.printStackTrace();            LogUtil.info(TAG, "error");            return false;        }    }至此结束附下创建的表单
 private final String getTBTemperature() {        StringBuffer sb = new StringBuffer();        //表单名DeviceParams        sb.append("CREATE Table IF NOT EXISTS TBTemperature(");        //primary key        sb.append("id integer primary key autoincrement,");        //设备唯一码        sb.append("uid VarChar(50),");        //货品名称        sb.append("GoodsName VarChar(20),");        //时间        sb.append("DateTime time,");        //温度上限        sb.append("maxTemperature Double,");        //温度下限        sb.append("minTemperature Double,");        //检测度数        sb.append("Temperature Double,");        //状态,是否超出范围        sb.append("STATUS Integer");        sb.append(")");        return sb.toString();    }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表