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)
您需要使用
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.bad和db.wal文件。
对于导出数据库文件:
我有同样的问题。您无需复制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)
我已经解决了。当导出(保存)您使用 Room 处理的 SQL 数据库时,您必须导出(然后导入)这两个文件 - your_database.bd 和 your_database.wal 文件。后来是一本日记,afaiu 保留最新的记录。
| 归档时间: |
|
| 查看次数: |
2940 次 |
| 最近记录: |