Java/Eclipse - 结果集和对象 class 不断覆盖

Java/Eclipse - Result Set and Object class constantly overwriting

我有一个无法解决的问题。我已经为此工作了几天,但无法找到问题所在。

我正在使用 MySQLWorkBench 从中插入数据和 retrieve/read 数据。 (只是想让你知道我从哪里获取数据)。

问题是我的 rs.next() 调用将获取相应的数据,但会用更新的条目覆盖数组中的每个 index/entry。我的对象 class 中的 toString 方法似乎也在这样做。

这两个问题是相辅相成的。

这是我的对象class。

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() 在我的对象 class 中的输出,请注意每个条目(时间戳键将帮助您看到这一点)如何被最新的条目覆盖:

[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 条记录。该程序将appends/make 10个实例的最新信息。

有谁知道问题出在哪里吗?

谢谢。

您需要将 SensorData oneSensor = new SensorData("","",""); 放入 while 循环中。由于它在您的 while 循环之外,因此即使在添加到您的 allSensors 列表后,oneSensor 中的数据也会被覆盖