【问题标题】:copy database from android room to file将数据库从android房间复制到文件
【发布时间】:2022-08-02 18:38:29
【问题描述】:

我想将我的 sqlite 数据库从\"/data/data/\" + c.getPackageName() + \"/databases/\" + DATABASE_NAME; 复制到用户想要在 java+xml 模式下备份的任何地方,并且恢复它没有任何问题。, 但是当我使用房间+撰写时。复制数据库时,没有任何问题,但无法恢复此(从备份复制到 \"/data/data/\"....,打开数据库时,此删除。

我认为我们可能必须在恢复数据库之前强制关闭房间数据库。 我的复制功能类是:

InputStream myInput = new FileInputStream(from);
OutputStream myOutput = new FileOutputStream(to);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
    myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();

    标签: android android-sqlite android-room android-jetpack-compose


    【解决方案1】:

    默认情况下,Room 使用 WAL(预写日志记录)。对数据库的更改写入 wal 文件(数据库文件名以 -wal 为后缀,WAL 文件同样写入 -shm 文件(不是那么重要))。

    如果仅复制数据库文件并且 -wal 文件存在且不为空,则不会复制部分数据库。考虑到数据库已损坏,这可能会导致打开,然后删除文件并创建一个全新的数据库。

    这是可能的问题。

    他们有3种解决方法,

    1. 确保数据库已完全检查点(已应用 -wal 文件中的所有内容),在备份之前关闭数据库应完全检查点数据库。

    2. 通过使用日志模式日志记录

      SupportSQLiteDatabasedisableWriteAheadLogging 方法(日志文件是已应用于数据库的更改的记录)。您可能会在 onOpen 回调中使用此方法,也可能在 onCreate 回调中使用此方法。

      1. 备份和恢复 -wal 和 -shm 文件以及主数据库。

      您可能希望阅读https://www.sqlite.org/wal.html

      额外的

      尽管 Kotlin 解决方案将文件复制到数据库目录,但您可能希望查看处理 WAL(或日志模式)方面的 following answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多