【问题标题】:Retrieve data duplication error检索数据重复错误
【发布时间】:2016-01-17 12:40:57
【问题描述】:

我想做什么:

  1. 进行 2 轮验证以从 MySQL 中检索数据,首先是检查一天中的时间,其次检查是否采用了该时间,如果没有采用该时间,我从该行获取数据并添加它进入一个数组列表。

问题:

  1. 我的逻辑是我运行循环while(rs.next()),我将进行第一轮检查,即检查时间,然后当检查通过时,它进入另一个if,当通过时检查它将从该行获取该数据并将其添加到arraylist。但是,当我运行代码时,我相信检查正在工作,但它会一遍又一遍地将相同的数据存储到 arraylist 中。特别是它存储最后一行的数据,例如 id 1,2,3,4,5,6 通过验证它只会一遍又一遍地存储 id6。

    try {   
        PreparedStatement stmt  = so.getPreparedStatementWithKey("SELECT * FROM et_elderly WHERE room = ?");
        stmt.setString(1, roomNum);
        stmt.executeQuery();
        rs = stmt.getResultSet();
    
        while(rs.next()){
            if(dosageTime.equalsIgnoreCase("morning")){
                if(rs.getInt("morningtaken")==0){
                    // calculate the age
                    java.sql.Date reportDate=rs.getDate("dob");
                    DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
                    String text = df.format(reportDate);
                    String year=text.substring(0, 4);
                    String month=text.substring(5,7);
                    String day=text.substring(8,10);
    
                    // setting the information
                    data.setElderBed(rs.getInt("bed"));
                    data.setElderName(rs.getString("name"));
                    data.setElderAge(ElderData.getAge(year,month,day));
                    data.setElderGender(rs.getString("gender"));
                    DosageList.add(data);   
                    numofElder++;
                }
            }
    
            else if (dosageTime.equalsIgnoreCase("afternoon")){
                if(rs.getInt("afternoontaken")==0){
                    // calculate the age
                    java.sql.Date reportDate=rs.getDate("dob");
                    DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
                    String text = df.format(reportDate);
                    String year=text.substring(0, 4);
                    String month=text.substring(5,7);
                    String day=text.substring(8,10);
    
                    // setting the information
                    data.setElderBed(rs.getInt("bed"));
                    data.setElderName(rs.getString("name"));
                    data.setElderAge(ElderData.getAge(year,month,day));
                    data.setElderGender(rs.getString("gender"));
                    DosageList.add(data);   
                    numofElder++;
                }
            }
            else if (dosageTime.equalsIgnoreCase("noon")){
                if(rs.getInt("noontaken")==0){
                    // calculate the age
                    java.sql.Date reportDate=rs.getDate("dob");
                    DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
                    String text = df.format(reportDate);
                    String year=text.substring(0, 4);
                    String month=text.substring(5,7);
                    String day=text.substring(8,10);
    
                    // setting the information
                    data.setElderBed(rs.getInt("bed"));
                    data.setElderName(rs.getString("name"));
                    data.setElderAge(ElderData.getAge(year,month,day));
                    data.setElderGender(rs.getString("gender"));
                    DosageList.add(data);   
                    numofElder++;
                }
            }
    
    
    
        }
    
    } catch (SQLException e1) {
    
        e1.printStackTrace();
    }
    

【问题讨论】:

  • 您是否每次都创建一个“新”对象?
  • 不应该:stmt.setString(1, roomNum);实际上是:stmt.setInt(1, roomNum);当然,除非房间确实是一个字符串。

标签: java mysql database swing arraylist


【解决方案1】:

您正在使用data 的单个实例,它只是在ResultSet 的每次迭代中更新...

while(rs.next()){
    if(dosageTime.equalsIgnoreCase("morning")){
        if(rs.getInt("morningtaken")==0){
            //...

            // You never create a new "data" object...
            // setting the information
            data.setElderBed(rs.getInt("bed"));
            data.setElderName(rs.getString("name"));
            data.setElderAge(ElderData.getAge(year,month,day));
            data.setElderGender(rs.getString("gender"));
            DosageList.add(data);   
            numofElder++;
        }
    }

所以,基本上,你只会得到一个List 的对象,它们都是同一个对象。你可以使用某种Set 进行测试,你最终会在Set 中得到一个项目。

相反,您可能需要考虑使用FactoryBuilder 模式,以确保在通过ResultSet 的每次迭代中,您正在创建一个新的data 实例,其中填充了数据库中的属性

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 2016-05-24
    • 2015-02-08
    • 1970-01-01
    • 2013-07-06
    • 2018-04-03
    • 2021-04-06
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多