【问题标题】:Filling an object list from MS SQL Server从 MS SQL Server 填充对象列表
【发布时间】:2012-05-02 17:27:08
【问题描述】:

我有这个用户类(这是示例的简化版本,真实的有更多参数但它们的实现方式相同):

public class User {

    private int _userID;
    private String _fullName;

    public User(){

    }

    public User(int userID, String fullName){
        this._userID = userID;

        this._fullName = fullName;
    }

    int getUserID(){
        return this._userID;
    }

    String getFullName(){
        return this._fullName;
    }
    void setUserID(int userID){
        this._userID = userID;
    }

    void setFullName(String fullName){
        this._fullName = fullName;
    }
}

我想从我的 MS SQL Server 中检索 Android 中此类对象的列表,我在连接器帮助程序类(负责使用 JDBC 与服务器建立连接的类)中使用此方法:

public List<User> getUsers(int ID){

        java.sql.ResultSet result = null;
        List<User> users = new ArrayList<User>();
        User user = new User();
        try {
             connection = this.getConnection();
             if (connection != null) {

                    //QUERY
                    String statement = "SELECT * Users WHERE groupID = " 
                                    + ID;
                    Statement select = connection.createStatement();

                    //Calls Query
                    result = select.executeQuery(statement);
                    while (result.next()){
                        user.setUserID(result.getInt("UserID"));
                        user.setFullName(result.getString("FullName"));
                        System.out.println(result.getString("FullName"));

                        //Adds to the list
                        users.add(user);

                    }


                    result.close();
                    result = null;
                    closeConnection();
             } 
             else {
                    System.out.println("Error: No active Connection");
             }
         }  catch (Exception e) {
             e.printStackTrace();
            }

        return users;
    }

根据我在每次迭代中使用的 System.out.println 从服务器很好地检索数据,问题是列表总是充满关于我检索的最后一个用户的重复信息,到澄清:

如果我有用户A,B和C,当我读取用户A时,列表具有以下结构:[A],当我读取用户B时,列表是:[B,B],当我读取用户C时:[ C,C,C] 等等。所以基本上列表中的所有对象都被最后一个读取的对象覆盖了。

我已经为此苦苦挣扎了几个小时,希望有人能发现问题,因为我不能,在此先感谢您的帮助。

【问题讨论】:

    标签: android sql list jdbc


    【解决方案1】:

    您在循环之前实例化单个用户对象,然后在每次迭代中修改相同的用户对象。因此,您最终会在列表中添加 N 次相同的用户对象。您必须在每次迭代时重新创建一个新用户:

    while (result.next()){
        User user = new User();
        user.setUserID(result.getInt("UserID"));
        ...
    

    【讨论】:

    • 我是 java 新手,我以前用 C++ 编程,每次迭代都应该覆盖来自对象的数据,我错了吗?无论如何感谢您的帮助,只是想了解其背后的逻辑。
    • 准确地说:对象中的数据在每次迭代中都会被覆盖。将对象添加到列表时,会将对象的引用(C++ 术语中的指针)添加到列表中。因此,您的代码会创建一个包含 N 个指向唯一对象的不同指针的列表,其中包含您在上次迭代时放入其中的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2018-12-07
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多