运行.jar文件时SQLite数据库无法更新的问题排查
数据库打包JAR后无法更新的问题及代码优化咨询
问题详情
- 类
DbHelper封装所有数据库操作,已实现通用插入方法以减少代码重复。 - 在IDE中通过
Launcher主类运行时,数据库可正常执行更新操作;但打包为.jar文件运行时,仅能读取数据,更新操作无法保存。 - 已尝试将所有更新方法的autocommit设为true(从未显式设为false),且确保
ResultSet使用后关闭,但问题仍存在。两种运行方式下数据库连接con均不为空,推测数据库处于只读状态。
数据库连接代码
public static Connection getConnection() { try { Class.forName("org.sqlite.JDBC"); // 加载SQLite JDBC驱动 String databaseUrl; // 运行.jar文件时使用 databaseUrl = "jdbc:sqlite::resource:ttlsDatabase.db"; // IDE中运行时使用(注释掉上面的资源路径) // databaseUrl = "jdbc:sqlite:C:\\Users\\medaw\\Desktop\\TTLS_APP\\src\\main\\Resource\\ttlsDatabase.db"; Connection databaseLink = DriverManager.getConnection(databaseUrl); return databaseLink; } catch (ClassNotFoundException e) { System.err.println("未找到SQLite JDBC驱动,请确保已将其添加到项目类路径中。"); } catch (SQLException e) { System.err.println("数据库操作出错:" + e.getMessage()); } return null; }
注:运行.jar时注释本地路径代码,IDE运行时注释资源路径代码。
通用更新方法(寻求优化建议)
该方法适用于所有单条查询的更新操作:
public static boolean updateDatabase(ArrayList<Object> list, String query){ try (Connection con = getConnection()) { con.setAutoCommit(true); PreparedStatement stmt = con.prepareStatement(query); stmt = setStatements(stmt, list); if (stmt == null) { return false; } int x = stmt.executeUpdate(); if(x == 0){ return false; } con.commit(); return true; } catch (Exception e) { UtilityMethods.showMessageDialog("无法更新条目!", "错误!", "更新失败", 1); } return false; }
项目目录结构
项目采用标准Maven目录结构,数据库文件ttlsDatabase.db存放于src/main/resources目录下。
内容的提问来源于stack exchange,提问作者sammy medawar
相关产品推荐
相关产品推荐

