【问题标题】:Android.database.sqllite.SQLiteDatabaseLocked Exception:database is locked (code 5): ,while compiling:PRAGMA journal_modeAndroid.database.sqllite.SQLiteDatabaseLocked Exception:database is locked (code 5): ,while compile:PRAGMA journal_mode
【发布时间】:2017-05-17 23:51:29
【问题描述】:

我在我的 Android 中使用 SQLite 作为 Gluon 移动应用程序。当我第一次访问数据库时,它可以正常工作,但另一次我有一个异常:

"Android.database.sqllite.SQLiteDatabaseLocked 异常:数据库是 锁定(代码 5)

访问数据库的代码是:

if (Platform.isAndroid()) {
  Class.forName("org.sqldroid.SQLDroidDriver");

  try {
    dir = Services.get(StorageService.class)
               .map(s -> s.getPrivateStorage().get())
               .orElseThrow(() -> new IOException("Error: PrivateStorage not available"));
    File db = new File(dir, DB_NAME);
    DBUtils.copyDatabase("/databases/", dir.getAbsolutePath(),   
DB_NAME);
    dbUrl = dbUrl + db.getAbsolutePath();
    System.out.println(dbUrl);
    c = DriverManager.getConnection(dbUrl);
  } catch (IOException ex) {

    Alert alert = new Alert(AlertType.CONFIRMATION, ex.getClass().getName());
    alert.setContentText(ex.getMessage());
    alert.showAndWait();
  }

  c.setAutoCommit(false);
  System.out.println("Opened database successfully");

  stmt = c.createStatement();
  ResultSet rs = stmt.executeQuery("SELECT * FROM COMPANYn;");

  while (rs.next()) {
    ObservableList<String> items = FXCollections.observableArrayList();
    String name1 = rs.getString("name");
    // System.out.println(name1);

    items.addAll(name1);

    ET.getItems().addAll(items);

    ET.getSelectionModel().select(0);

  }
  rs.close();
  stmt.close();
  c.close();

请有人可以帮助我。感谢您的帮助。

【问题讨论】:

  • 您没有显示关闭 sql 语句、结果或连接的代码。你会关闭它们吗?
  • @JoséPereda 我更新了上面的代码。是的,我关闭它。还是说错了?
  • 您为什么不关注 GluonSQLite 示例?正确使用 try-catch-finally。
  • 感谢@JoséPereda 的回答。我尝试了一下,但我遇到了同样的错误

标签: android javafx gluon


【解决方案1】:

我在相同的情况下收到了同样的错误(连接到 sqlite,使用 Gluon 并在 Android 上运行)。在桌面上运行良好,但出现与您在 Android 上的标题相同的错误。

有趣的是,我发现我的第二个 SELECT 语句而不是我的第一个是抛出错误的那个。在关闭第一个语句、结果集和连接之后,第二个语句位于一个单独的方法中。

我最终发现关闭我的 sqlite 连接似乎为我解决了这个问题。这看起来很奇怪,因为我习惯于在事务、方法等结束时关闭它们,但这在 sqlite 中似乎并不异常。

有关该主题的一些相关信息,请参见此处:

Android: Cannot perform this operation because the connection pool has been closed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2011-07-24
    • 2022-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多