Android会议室数据库不会导出所有数据

Tue*_* AM 6 android android-sqlite android-sql android-room

我正在尝试设置Room数据库备份功能。问题是,一旦下载,sql数据库文件在应用程序中将不包含最新的数据集。它总是会丢失一些最新记录。是否有导出会议室数据库的正确方法?PS:使用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()
    }
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*lam 8

您需要使用

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;
}
Run Code Online (Sandbox Code Playgroud)

此方法将不会创建在导出房间db中造成障碍的db.baddb.wal文件。

对于导出数据库文件:

链接:每天导出带有创建文件夹的数据库


Muz*_*ain 5

我有同样的问题。您无需复制wal(预先写入日志文件),它是一个临时文件。根据文档,我们需要在导入或导出数据库之前关闭与数据库的所有连接。这解决了我的问题,现在我只需要复制主数据库文件。

数据库类示例:

public abstract class AppDB extends RoomDatabase {    

    private static final Object sLock = new Object();

    private static AppDB INSTANCE;

    // create new database connection
    public static AppDB getInstance(final Context context) {
        synchronized (sLock) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDB.class, "packagename")                    
                    .build();
                }
            return INSTANCE;
        }
    }

    // close database
    public static void destroyInstance(){
        if (INSTANCE.isOpen()) INSTANCE.close();
        INSTANCE = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 问题是,如果您重新打开数据库并尝试执行任何操作,它将失败,如下所示:/sf/ask/3569098361/ (3认同)
  • 只需在您的所有会议室数据库对象上调用close()函数。 (2认同)

Tue*_* AM 3

我已经解决了。当导出(保存)您使用 Room 处理的 SQL 数据库时,您必须导出(然后导入)这两个文件 - your_database.bd 和 your_database.wal 文件。后来是一本日记,afaiu 保留最新的记录。