2009-11-06 46 views
8

Tôi đang viết một chương trình sẽ truy vấn cơ sở dữ liệu truy cập MS, trả về truy vấn dưới dạng tập kết quả, và sau đó tôi muốn chuyển đổi kết quả cuối cùng thành chuỗi String, để tôi có thể vượt qua nó vào hàm tạo của một Swing JComboBox - vì vậy ComboBox sẽ liệt kê các mục được truy vấn trả về.Chuyển đổi kết quả Java thành mảng String

Tôi đã có thể lưu trữ các hàng của tập kết quả vào một ArrayList, và sau đó chuyển đổi ArrayList đó thành một mảng đối tượng, và combobox sẽ liệt kê các mục chính xác, nhưng làm đối tượng. Tôi chỉ đơn giản là không bao giờ có thể đúc ArrayList đó vào một mảng String. Có ai biết nếu điều này là có thể? Đây là một số mã của tôi ...

// Convert the Resultset into an array list 

public ArrayList<ArrayList<Object>> Results2Array(ResultSet rs) throws SQLException { 
    ResultSetMetaData metaData = rs.getMetaData(); 
    int columns = metaData.getColumnCount(); 

    ArrayList<ArrayList<Object>> al = new ArrayList<ArrayList<Object>>(); 

    while (rs.next()) { 
     ArrayList<Object> record = new ArrayList<Object>(); 

     for (int i = 1; i <= columns; i++) { 
      Object value = rs.getObject(i); 
      record.add(value); 
     } 
     al.add(record); 
    } 
    return al; 
} 

// Convert ArrayList to Object Array, and pass into GUI 

ArrayList<String> Locations = new ArrayList<String>(); 
ArrayList<String> Months = new ArrayList<String>(); 
ArrayList<String> Years = new ArrayList<String>(); 

try { 
    DB.loadDriver(); 
    DB.makeConnection(); 
    DB.buildStatement(); 

    Locations = DB.getLocations(); 
    Months = DB.getMonths(); 
    Years = DB.getYears(); 

    Object[] arrLocations = Locations.toArray(); 
    Object[] arrMonths = Months.toArray(); 
    Object[] arrYears = Years.toArray(); 

    dbGUI ui = new dbGUI(arrLocations, arrMonths, arrYears); 
    ui.setVisible(true); 

Có ai có thể đưa ra bất kỳ đề xuất nào không? Cảm ơn!


UPDATE:

Đây là vết đống mà tôi đang nhận:

java.lang.ArrayStoreException 
    at java.lang.System.arraycopy(Native Method) 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.util.ArrayList.toArray(Unknown Source) 
    at kidsfirstdb.Main.main(Main.java:23) 

Trả lời

5
String[] arrLocations = locations.toArray(new String[0]); 

là câu trả lời đúng. Lý do cho ngoại lệ của bạn là tất cả các đối tượng trong thực tế không phải là chuỗi.

Bạn cần phải thay đổi điều này:

Object value = rs.getObject(i); 

này:

String value = rs.getString(i); 

hay này:

String value = rs.getObject(i).toString(); 

Đó cuối cùng sẽ cần một kiểm tra null nếu bạn có thể quay trở lại null cột.

Lưu ý rằng biểu diễn toString() có thể không chính xác những gì bạn đang tìm kiếm trong mọi trường hợp, nhưng nó sẽ giúp bạn bắt đầu.

Chỉnh sửa: Nếu bạn đang điền vào một hộp kết hợp, bạn sẽ cần một cột cho mỗi hàng, phải không? Nếu không, bạn cần biểu diễn toàn bộ hàng dưới dạng một chuỗi theo một số kiểu.Sau đó, bạn đặt giá trị đó vào giá trị và đặt giá trị trực tiếp vào danh sách mảng cuối cùng, do đó vòng lặp của bạn cần trông giống như sau:

ArrayList<String> al = new ArrayList<String>(); 
    while (rs.next()) { 
      ArrayList<String> record = new ArrayList<String>(); 
      for (int i = 1; i <= columns; i++) { 
        String value = rs.String(i); 
        record.add(value); 
      } 
      String value = methodWhichConvertsArrayListToStringTheWayYouNeedItFormatted(record); 
      al.add(value); 
    }   
    return al; 
+0

Cảm ơn sự giúp đỡ của bạn. Tôi đã thử những gì bạn đề nghị, và tôi vẫn dường như nhận được những ngoại lệ trên String [] arrLocations = locations.toArray (new String [0]); – littleK

+0

Bây giờ nếu bạn không nhớ, hãy chia sẻ dấu vết ngăn xếp. –

+0

Tôi đã thêm dấu vết ngăn xếp vào bài đăng gốc, cảm ơn. – littleK

3

String[] arrLocations = locations.toArray(new String[0]);

Đoạn mã trên sẽ chuyển đổi Danh sách Strings để String mảng. Bây giờ trong trường hợp của bạn, bạn đang tạo Danh sách các đối tượng để bạn không thể chuyển đổi trực tiếp nó thành mảng String. Thông thường, bạn có 2 lựa chọn:

  1. Ban đầu xác định Danh sách của bạn dưới dạng chuỗi và khi điền danh sách chuyển đổi giá trị thành chuỗi (ether bằng cách thực hiện Object # toString hoặc trích xuất/tạo ra giá trị chuỗi meningful) và lưu trữ Danh sách, ví dụ trong mã của bạn, hãy làm điều này String value = rs.getObject(i).toString();
  2. Nếu bạn không làm điều đó trong bước 1 thì bạn sẽ phải phân bổ một mảng String, lặp qua Danh sách của bạn, chuyển giá trị hiện tại thành Chuỗi và dán nó vào mảng. Tôi sẽ đi với tùy chọn 1.

Cũng giống như một mặt lưu ý - phương pháp trong Java nên bắt đầu với chữ cái thường

+0

tôi đã cố gắng mà trước đó, và nó đã đem lại cho tôi một: java.lang.ArrayStoreException \t tại java.lang.System.arraycopy (Native Method) \t tại java.util.Arrays.copyOf (Unknown Source) \t tại java.util.ArrayList.toArray (Nguồn không xác định) \t tại kidsfirstdb.Main.main (Main.java:23) – littleK

+1

Xem bài đăng mở rộng của tôi – Bostone

+0

Làm việc tốt DroidIn. Nhưng thực tế là danh sách trả về là một danh sách các danh sách. Ngay cả khi chúng ta sử dụng toString() hoặc rs.getString(). Nó sẽ không hoạt động cho Danh sách được trả về bởi phương thức này. –

5

Tại sao không sử dụng rs.getString(). Tôi sẽ không khuyên bạn nên làm điều đó mặc dù. Nhưng nó sẽ giải quyết vấn đề của bạn. Tôi có nghĩa là chỉ cần đối phó với String từ đầu. Ví dụ:

// Not a good idea to pass a active resultset as a parameter. 
// Use disconnected implementation instead, for example rowset. 
public ArrayList<ArrayList<Object>> results2Array(ResultSet rs) 
      throws SQLException { 
    ResultSetMetaData metaData = rs.getMetaData(); 
    int columns = metaData.getColumnCount(); 

    ArrayList<String[]> list = new ArrayList<String[]>(); 

    while (rs.next()) { 
      String[] record = new String[columns]; 

      for (int i = 1; i <= columns; i++) { 
        // Not a good idea to get everything as a string. This way you will 
        // get a default string representation of objects. Suppose, you 
        // want to format dates and doubles as per some requirement. 
        record[i-1] = rs.getString(i); 
      } 
      list.add(record); 
    } 
    return list; 
} 

Bây giờ bạn cần làm như sau.

String[][] arrLocations = locations.toArray(new String[locations.size()][0]); 

Vẫn kiểm tra tốt hơn loại và nhận giá trị phù hợp, sử dụng siêu dữ liệu bạn đang có. Điều này sẽ giúp bạn định dạng dữ liệu, cụ thể là ngày và tăng gấp đôi.

Các vấn đề liên quan