Java连接带密码保护的SQLite数据库报找不到表错误如何解决
加密SQLite数据库Java连接方案
问题原因分析
报错的根本原因是原生sqlite-jdbc驱动默认不支持加密数据库验证,你在URL中拼接的
Password参数无法被驱动识别,驱动尝试打开加密数据库时会判定为文件无效,触发SQLite默认的「文件不存在则创建空数据库」逻辑,最终生成的空库中没有Employees表,所以抛出表不存在的错误。
解决步骤
1. 替换支持加密的JDBC驱动
使用支持加密的SQLite JDBC驱动,比如sqlite-jdbc-crypt,如果是Maven项目,在pom.xml中添加如下依赖:
<dependency> <groupId>com.github.willena</groupId> <artifactId>sqlite-jdbc-crypt</artifactId> <version>3.41.2.1</version> </dependency>
如果是Gradle项目可以对应添加依赖配置,同时要移除项目中原生sqlite-jdbc的依赖,避免版本冲突。
2. 修正连接逻辑
不要将密码写在JDBC URL中,而是在建立连接后、执行其他SQL操作前,通过PRAGMA key命令传入密码,修正后的连接类代码如下:
public class SQliteDbConnection { public static Connection connect() throws ClassNotFoundException { Class.forName("org.sqlite.JDBC"); // 仅保留数据库路径,不要加Password等无关参数 String url = "jdbc:sqlite:C:/ProgramData/BioPlugin/RightPunch.db"; String dbPassword = "12345"; Connection conn = null; try { conn = DriverManager.getConnection(url); // 连接建立后立即传入密码 try (Statement stmt = conn.createStatement()) { stmt.execute("PRAGMA key = '" + dbPassword + "';"); // 如果你的数据库是用SQLCipher加密的,还需要额外添加适配配置,比如: // stmt.execute("PRAGMA cipher_compatibility = 3;"); } System.out.println("Connected with Database successfully"); } catch (Exception e) { e.printStackTrace(); } return conn; } }
3. 业务查询代码无需修改
你原有查询Employees表的代码可以直接复用,无需调整。
常见排查点
- 确认加密数据库的加密算法和驱动支持的算法匹配,如果你是用SQLCipher加密的数据库,需要使用支持SQLCipher的驱动版本,并且添加对应的cipher兼容配置
- 确认C盘
ProgramData目录的读写权限,避免因权限不足导致无法读取原数据库、触发新建空库的逻辑 - 如果修改后仍提示密码错误,确认你加密数据库时使用的密码和代码中传入的密码完全一致
内容的提问来源于stack exchange,提问作者Ashiqur Rahman Abir
相关产品推荐
相关产品推荐

