在做一个项目时,遇到一个问题:易英健每分钟会记录一比数据,需要用手机扫描,获取此数据,但每次携带过来的数据就会有重复得数据,数据需要每次的重复插入,而每次的更新数量较少(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(); }
新闻热点
疑难解答