2013-02-12 23 views
0

我使用Java和SQLite和我有以下情況:插入/讀陣列到SQLite數據庫在java中

我有一個數據庫連接,並創建了一個表說瑞銀

現在我有陣列int[] ddouble[] o在Java中,將其存儲在數據庫中的最有效方式是什麼?我嘗試分段插入並閱讀...插入工作,但它沒有正確讀出。

這裏是我的代碼:

int size = 20; 
    int[] d = new int[size]; 
    double[] o = new double[size]; 
    double[] c = new double[size]; 

    int[] dtest = new int[size]; 
    double[] otest = new double[size]; 
    double[] ctest = new double[size]; 


    for(int a = 0; a< size; ++a) { 
     d[a] = a+1; 
     o[a] = Math.random(); 
     c[a] = Math.random(); 
    } 

    Connection conn = DriverManager.getConnection(sDbUrl); 


    Statement stat = conn.createStatement(); 
    stat.executeUpdate("CREATE TABLE ubs (date INTEGER, open DOUBLE, close DOUBLE)"); 
    PreparedStatement prep = conn.prepareStatement("insert into ubs values (?,?,?);"); 
    for(int a = 0; a < size; ++a) { 
     prep.setInt(1, d[a]); 
     prep.setDouble(2,o[a]); 
     prep.setDouble(3,c[a]); 
     prep.addBatch(); 
    } 

    conn.setAutoCommit(false); 
    prep.executeBatch(); 
    conn.commit(); 
    conn.setAutoCommit(true); 
    ResultSet rs = stat.executeQuery("select * from ubs;"); 
    int a = 0; 
    while (rs.next()) 
    { 
     dtest[a] = rs.getInt("date"); 
     otest[a] = rs.getDouble("open"); 
     ctest[a] = rs.getDouble("close"); 
     ++a; 
    } 
    rs.close(); 
    conn.close(); 


    //test wether contain the same: 
    for(a = 0; a< size; ++a) { 
     System.out.println("original: " + o[a] +" saved: "+otest[a]); 

    } 

這裏是它返回:

original: 0.707119601198528 saved: 0.22184821183493642 
    original: 0.6160408saved: 0.0 
    original: 0.32427329912284675 saved: 0.0 
    original: 0.570393637345201 saved: 0.0 
    original: 0.05334583924906977 saved: 0.0 
    original: 0.5920142191693711 saved: 0.0 
    original: 0.5440058264918218 saved: 0.0 
    original: 0.9792739762035961 saved: 0.0 
    original: 0.7288365270388483 saved: 0.0 
    original: 0.862852415217843 saved: 0.0 
    original: 0.6427868320117643 saved: 0.0 
    original: 0.4895153310585434 saved: 0.0 
    original: 0.9163102294291119 saved: 0.0 
    original: 0.7991642836297964 saved: 0.0 
    original: 0.35640672534480244 saved: 0.0 
    original: 0.047751063499014146 saved: 0.0 
    original: 0.4956032547461785 saved: 0.0 
    original: 0.8975964852843482 saved: 0.0 
    original: 0.11097820888267451 saved: 0.0 
    original: 0.22184821183493642 saved: 0.0 

這沒有道理。所以我做錯了什麼?我該如何改進它?順便說一句,這段代碼可能完全沒有意義,因爲我從不同的教程拼湊起來,所以很抱歉。

+0

你必須在'ubs'表3列的數組索引不會增加,但你將只有兩個'值(?。?)'。另外,您正在使用o [a]和c [a]兩次執行'prep.setDouble(2,o [a])'。因此,'c [a]'覆蓋'o [a]'。 – 2013-02-12 14:10:39

+0

@BimaleshJha謝謝我改變了覆蓋錯誤,但它仍然沒有做我想做的事......我更新了上面的數據,保存的列返回原始數據的最後一個條目,然後爲零,關閉列爲空數據庫 – user2058490 2013-02-12 14:54:51

+0

你也應該像插入'插入到ubs的值(?,?,?)',並且在設置con.setAutocmmit(true)之前在'executeBatch()'調用之後執行con.commit()。 – 2013-02-12 15:05:56

回答

1

在你下面的循環

int a = 0; 
while (rs.next()) 
{ 
     dtest[a] = rs.getInt("date"); 
     otest[a] = rs.getDouble("open"); 
     ctest[a] = rs.getDouble("close"); 
} 

在末尾添加a++

基本上,後rs.next()

+0

哦,對你所有的愚蠢錯誤表示歉意!嘿,這些實現標準或我只是一個黑客? – user2058490 2013-02-12 16:10:37