Android房间数据库不会导出所有数据

标签 android android-sqlite android-room android-sql

我正在尝试设置 Room 数据库备份功能。 问题是 sql 数据库文件在下载后不包含应用程序中的最新数据集。它总是会遗漏一些最近的记录。 有导出房间数据库的正确方法吗? 附言我在使用 sqliteHelper 处理我的数据库时没有遇到类似的问题,所以我想它一定与 Room 有关。

我的做法:

@Throws(IOException::class)
private fun copyAppDbToDownloadFolder(address: String) {
    val backupDB = File(address, "studioDb.db") 
    val currentDB = applicationContext.getDatabasePath(StudioDatabase.DB_NAME)
    if (currentDB.exists()) {
        val src = FileInputStream(currentDB).channel
        val dst = FileOutputStream(backupDB).channel
        dst.transferFrom(src, 0, src.size())
        src.close()
        dst.close()
    }
}

最佳答案

你需要使用

JournalMode.TRUNCATE

在你的 AppDatabase.java 中:

private static AppDatabase sInstance;

public static AppDatabase getDatabase(final Context context) {
    if (sInstance == null) {
        synchronized (AppDatabase.class) {
            if (sInstance == null) {
                sInstance = Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME)
                        .setJournalMode(JournalMode.TRUNCATE)
                        .build();
            }
        }
    }
    return sInstance;
}

此方法不会创建阻碍导出房间数据库的 db.baddb.wal 文件。

导出数据库文件:

Link: Exporting db with creating folder on daily basis

关于Android房间数据库不会导出所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49394683/

相关文章:

android - ActiveAndroid 使用架构迁移预填充表

java - Picasso 加载 PHOTO_THUMBNAIL_URI 但不加载 PHOTO_URI

Android 外部与内部数据库混淆

android - 从字符串中删除无效的数字字符

java - android,asynctask,在 doInBackground() 中写入/读取数据库失败

android - 调用函数删除一行

android - 钢琴应用程序的onTouchListener

java - 如何从Android Room中的多个数据库中进行选择(How to attach databases)

java - 是否可以将 Transformations.switchMap 放入存储库中?

android - 如何从 Room 获取 LiveData?