【问题标题】:Java - JDBC Driver SQLite 3.7.2 - Unable to open database test.db: file is encrypted or is not a databaseJava - JDBC 驱动程序 SQLite 3.7.2 - 无法打开数据库 test.db:文件已加密或不是数据库
【发布时间】:2012-09-29 23:13:42
【问题描述】:

我正在使用 java 中的 SQLite JDBC 驱动程序 3.7.2 将一些数据写入数据库文件。当我尝试在命令行上打开数据库文件时,我收到一条错误消息:

“无法打开数据库 test.db:文件已加密或不是数据库”

我做了一个导致这种行为的最小示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

public class PlaygroundSQLite {
    public static void insertIntoDB(String dbFilename, String tablename){
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:"+dbFilename);
            PreparedStatement prep = conn.prepareStatement("insert into " + tablename + "( id, text) values (?, ?);");

            prep.setString(1, "1FD22A38");
            prep.setString(2, "This is a simple test");

            prep.addBatch();

            conn.setAutoCommit(false);
            prep.executeBatch();
            conn.setAutoCommit(true);

            conn.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void createDB(String dbFilename, String tablename){
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbFilename);
            Statement stat = conn.createStatement();
            stat.executeUpdate("drop table if exists test;");
            stat.executeUpdate("create table " + tablename + " (key INTEGER PRIMARY KEY, id TEXT , text TEXT);");
            conn.close();
            stat.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String dbFilename = "test.db";
        String tablename = "test";

        PlaygroundSQLite.createDB(dbFilename, tablename);
        PlaygroundSQLite.insertIntoDB(dbFilename, tablename);
    }
}

【问题讨论】:

  • 这里的问题是 Java SQLite JDBC 驱动程序(版本 3.7.2)和我机器上安装的 SQLite 版本(版本 2.8.17)之间的版本不匹配。使用 sqlite3 二进制文件解决了这个问题。我搜索了很长一段时间的解决方案,所以我想我在这里发布它是为了让使用 Java 的人更容易找到解决方案(正如我在一些与 Java 无关的帖子中找到的那样)。
  • 然后回答你自己的问题而不是发表评论:)
  • 感谢您的提示。不幸的是,虽然我必须等待 8 小时,因为我还没有足够的声望点。

标签: java sqlite jdbc


【解决方案1】:

这里的问题是 Java SQLite JDBC 驱动程序(版本 3.7.2)和我机器上安装的 SQLite 版本(版本 2.8.17)之间的版本不匹配。使用 sqlite3 二进制文件解决了这个问题。

【讨论】:

    【解决方案2】:

    有没有这样的东西:“Java 中的 SQLite JDBC 驱动程序 3.7.2”?我知道 JavaDB (Derby),但不知道 Java 内部实际上有一个 SQLite JDBC 驱动程序。

    【讨论】:

      【解决方案3】:

      试试这个代码:

      Properties config = new Properties();
      config.put("journal_mode", "WAL");
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:"+dbFilename,config);
      

      【讨论】:

      • 请尝试在您的答案中添加一些解释,为什么此代码可以解决问题以及与问题代码相比的重要更改是什么。
      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多