Java / Eclipse - набор результатов и класс объектов постоянно перезаписываются - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть проблема, с которой я не могу разобраться.Я работал над этим в течение нескольких дней, но не могу найти проблему.

Я использую MySQLWorkBench для вставки и извлечения / чтения данных из.(Просто чтобы вы знали, откуда я получаю данные).

Проблема в том, что мой rs.next() вызов захватит соответствующие данные, но перезапишет каждый индекс / запись в массиве более новой записью,Мой toString метод в моем объектном классе также, кажется, делает это.

Обе эти проблемы неразрывно связаны.

Это мой класс объектов.

public class SensorData {
    String tagid;
    String attemptstatus;
    String timestamp;

    public SensorData(String tagid, String attemptstatus, String timestamp) {
        super();
        this.tagid = tagid;
        this.attemptstatus = attemptstatus;
        this.timestamp = timestamp;
    }

    // Constructors depending on which parameters are known
    public SensorData(String timestamp, String attemptstatus) {
        super();
        this.timestamp = timestamp;
        this.attemptstatus = attemptstatus;
        this.tagid = "unknown";
    }

    public SensorData(String attempstatus) {
        super();
        this.tagid = "unknown";
        this.attemptstatus = attempstatus;
        this.timestamp = "unknown";
    }


    public String getTagIdValue() {
        return tagid;
    }
    public void setTagIdValue(String tagid) {
        this.tagid = tagid;
    }

    public String getTimeStampValue() {
        return timestamp;
    }
    public void setTimeStampValue(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getAttemptStatus() {
        return attemptstatus;
    }
    public void setAttemptStatus(String attemptstatus) {
        this.attemptstatus = attemptstatus;
    }

    @Override
    public String toString() {
        return "SensorData [tagid=" + tagid + ", + attemptStatus=" + attemptstatus + ", timestamp=" + timestamp + "]";
    }

И это мой вызов моей базы данных и попытка получить все соответствующиеинформация.

`private String retrieveSensorData (String sensorname) {

String selectSQL = "select * from sensorusage where tagid='" + 
        sensorname + "' order by timestamp asc";

ResultSet rs;


        ArrayList<SensorData> allSensors = new ArrayList<SensorData>();
        try {           



        rs =  stmt.executeQuery(selectSQL); 


            SensorData oneSensor =  new SensorData("","","");

            while (rs.next()) {
                oneSensor.setTagIdValue(rs.getString("tagid"));
                oneSensor.setAttemptStatus(rs.getString("attemptstatus"));
                oneSensor.setTimeStampValue(rs.getString("timestamp"));
                allSensors.add(oneSensor);
                System.out.println(allSensors.toString());
            }

            } catch (SQLException ex) {
                    System.out.println("Error in SQL " + ex.getMessage());
            }
        String allSensorsJson = gson.toJson(allSensors);
        System.out.println("-----------------");
        System.out.println(allSensorsJson);
        return allSensorsJson;

    }`

Теоретически это должно работать, однако это вывод в моей консоли.

Это вывод консоли массива allSensors

[{"tagid":"Card3","attemptstatus":"Failed","timestamp":"2018-11-29 00:09:53.0"},{"tagid":"Card3","attemptstatus":"Failed","timestamp":"2018-11-29 00:09:53.0"},{"tagid":"Card3","attemptstatus":"Failed","timestamp":"2018-11-29 00:09:53.0"},{"tagid":"Card3","attemptstatus":"Failed","timestamp":"2018-11-29 00:09:53.0"},{"tagid":"Card3","attemptstatus":"Failed","timestamp":"2018-11-29 00:09:53.0"}]

А это вывод моего toString() в моем классе объектов, обратите внимание, как каждая запись (ключ метки времени будетпоможет вам увидеть это) перезаписывается последней записью:

[SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:43:26.0]]
[SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:53:05.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:53:05.0]]
[SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:54:48.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:54:48.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:54:48.0]]
[SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:56:05.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:56:05.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:56:05.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-28 23:56:05.0]]
[SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-29 00:09:53.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-29 00:09:53.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-29 00:09:53.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-29 00:09:53.0], SensorData [tagid=Card3, + attemptStatus=Failed, timestamp=2018-11-29 00:09:53.0]]

В конце концов, у меня есть вывод на моей веб-странице, в котором указано правильное количество записей, но все с одинаковыми данными.

Программа выдает правильное количество результатов, например, правильное количество записей с данным tagid, но постоянно добавляет последнюю запись для максимально возможного количества записей, т. Е. Если есть 10 записей, где tagid = "card10", то яполучит 10 записей с одинаковыми данными.Программа добавит / сделает 10 экземпляров самой последней информации.

Кто-нибудь знает, в чем проблема?

Спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

Вам нужно поместить SensorData oneSensor = new SensorData("","",""); в ваш цикл while.Поскольку он находится за пределами цикла while, данные в oneSensor перезаписываются даже после добавления в список allSensors

...