首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC不在sqlite数据库中存储更新

JDBC不在sqlite数据库中存储更新
EN

Stack Overflow用户
提问于 2011-09-21 02:16:41
回答 3查看 2.3K关注 0票数 2

我编写了一个应用程序,它使用JDBC在SQlite数据库中插入一些数据,并具有读取/更新这些数据的能力。

问题是,当我按应用程序更改数据时,它会更新数据,而当程序打开时,读取这些数据会给出新的(更新的)数据。

但当我退出程序并重新运行它时,所有这些更改都会丢失,并且数据会重新设置为第一次打开程序时的状态!

我是这样连接的:

代码语言:javascript
复制
Class.forName("org.sqlite.JDBC");
con=DriverManager.getConnection("jdbc:sqlite:archive.sqlite");

然后像这样更新四个表:

代码语言:javascript
复制
try{
    String Q="UPDATE data SET startdate=?,fazelab=?,length=?,maliat=?,other=?,price=?,public=?,usage=?,abbaha=?,enddate=? WHERE id='"+ID+"'";
    PreparedStatement PS= this.con.prepareStatement(Q);
    PS.setString(1, (String)data.get("startdate"));
    PS.setInt(2, (Integer)data.get("fazelab"));
    PS.setInt(3, (Integer)data.get("length"));
    PS.setInt(4, (Integer)data.get("maliat"));
    if(data.containsKey("other"))
        PS.setInt(5, (Integer)data.get("other"));
    else
        PS.setInt(5, 0);
    PS.setLong(6, (Long)data.get("price"));
    PS.setDouble(7, (Double)data.get("public"));
    PS.setInt(8, (Integer)data.get("usage"));
    PS.setInt(9, (Integer)data.get("abbaha"));
    PS.setString(10, (String)data.get("enddate"));
    COUNT=PS.executeUpdate();

    Q="UPDATE cold SET cE1=?,cW1=?,cE2=?,cW2=?,cE3=?,cW3=?,cE4=?,cW4=? WHERE dataid='"+ID+"'";
    PS= this.con.prepareStatement(Q);
    PS.setDouble(1, cold.get("cE1"));
    PS.setDouble(2, cold.get("cW1"));
    PS.setDouble(3, cold.get("cE2"));
    PS.setDouble(4, cold.get("cW2"));
    PS.setDouble(5, cold.get("cE3"));
    PS.setDouble(6, cold.get("cW3"));
    PS.setDouble(7, cold.get("cE4"));
    PS.setDouble(8, cold.get("cW4"));
    COUNT+=PS.executeUpdate();

    Q="UPDATE hot SET hE1=?,hW1=?,hE2=?,hW2=?,hE3=?,hW3=?,hE4=?,hW4=? WHERE dataid='"+ID+"'";
    PS= this.con.prepareStatement(Q);
    PS.setDouble(1, hot.get("hE1"));
    PS.setDouble(2, hot.get("hW1"));
    PS.setDouble(3, hot.get("hE2"));
    PS.setDouble(4, hot.get("hW2"));
    PS.setDouble(5, hot.get("hE3"));
    PS.setDouble(6, hot.get("hW3"));
    PS.setDouble(7, hot.get("hE4"));
    PS.setDouble(8, hot.get("hW4"));
    COUNT+=PS.executeUpdate();

    Q="UPDATE usages SET E1=?,W1=?,E2=?,W2=?,E3=?,W3=?,E4=?,W4=? WHERE dataid='"+ID+"'";
    PS= this.con.prepareStatement(Q);
    PS.setDouble(1, USGs.get("E1"));
    PS.setDouble(2, USGs.get("W1"));
    PS.setDouble(3, USGs.get("E2"));
    PS.setDouble(4, USGs.get("W2"));
    PS.setDouble(5, USGs.get("E3"));
    PS.setDouble(6, USGs.get("W3"));
    PS.setDouble(7, USGs.get("E4"));
    PS.setDouble(8, USGs.get("W4"));
    COUNT+=PS.executeUpdate();

    PS.close();
}finally{
    return COUNT;
}

有什么问题吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-21 02:56:11

有三点你应该检查一下:

  • 是否在发出下一条语句之前关闭了所有资源,如PreparedStatementResultSet等?最后还要正确关闭Connection
  • 你的自动提交状态是什么?用getAutoCommit()Connection上查看。如果为false,则必须手动发出Connection.commit()
  • 检查数据库本身的设置: sqlite是一个嵌入式数据库,有时为了便于启动或单元测试,这些数据库具有奇怪的默认配置。例如:“只在内存中启动我”或“启动时截断所有表”。别笑,我见过这样的事情!请查看相关文档。
票数 3
EN

Stack Overflow用户

发布于 2011-09-21 02:27:48

您正在创建多个中间PreparedStatements并将其丢弃。在移动到下一个查询之前,您很可能需要关闭它们。

票数 1
EN

Stack Overflow用户

发布于 2011-09-21 02:31:37

finally中有一个return语句,它包含所有异常。Don't do that。如果你把返回值移到finally之外,你就会发现问题出在哪里。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7489805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档