データベースは、設定されたデータ量の上限に従って、同一でないデータ リストを取得します。

プロジェクトに取り組んでいるとき、私は問題に遭遇しました: Yi Yingjian は毎分データの比率を記録し、このデータを取得するために携帯電話でスキャンする必要がありましたが、データが持ち込まれるたびにデータが重複し、データは毎回記録が必要 繰り返し挿入だが、毎回の更新回数が少なく(1分)、以降のデータ量がやや多い(ストレージがいっぱいになると毎回4kデータを読み込む)ため、重複データが多くなり、メモリが大量に占有され、読み込み速度が低下する可能性がある現在、これを軽減する方法があります (重複データの削除方法は、今後更新される可能性があります)。現在の方法は、重複しないデータを照会することです。

Android携帯を使っているので全てJavaコードで、データベースのクエリメソッドはAndroidに付属のSQLを使っています。難しいのは、クエリ部分の選別と、重複データベースの削除操作(ただし、重複データの削除方法ではない)です。

1つ目はクエリ部分(挿入部分は説明なし)

/**
     * 查找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();
    }




おすすめ

転載: blog.csdn.net/u013377003/article/details/54909142