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 中的数据也会被覆盖
我有一个无法解决的问题。我已经为此工作了几天,但无法找到问题所在。
我正在使用 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 中的数据也会被覆盖