【发布时间】:2020-08-06 18:54:42
【问题描述】:
我已将我的应用升级为具有 Room 数据库。当用户升级到我的新应用程序版本时,我需要将数据导入到存储在其他数据结构中的房间数据库中。乍一看,Room 似乎已经支持这种场景:
db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "my-db")
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
// IMPORT DATA
}
})
.build();
但是,当尝试实际导入数据时,事情会变得更加复杂。当我尝试使用 Entities、Daos 和 AppDatabase 导入数据时,我遇到了一个异常:
java.lang.IllegalStateException: getDatabase 被递归调用
似乎不可能使用所有漂亮的 Room Entities、Daos 等将数据导入数据库。但是,onCreate 方法确实提供了对底层 SQLite 数据库的访问。也许我打算在那里导入数据?
直接使用 SQLite 数据库的documentation 比较薄。它以一个大红色警告开始,不要直接访问 SQLite 数据库,而是使用 Room 抽象!
我应该如何进行?这通常是怎么做的?
此时我使用实体定义的表是否已经存在?还是需要先用 SQL 语句创建表,然后才能开始导入数据?
【问题讨论】:
-
您是否考虑过在应用升级时使用现有数据库来prepopulate your Room DB?
-
我的应用程序中没有现有数据库。
-
包含现有数据的“其他数据结构”有哪些?
-
查看此问题的答案:stackoverflow.com/q/50775527/4815718。一种选择是使用单独的线程进行导入。
-
因为你有一个
SupportSQLiteDatabase可以使用它,它将是用于Android 中的sql 数据库的标准机制,使用插入ContentValues。建议它在事务中执行,以确保所有插入都作为一个执行。 developer.android.com/reference/android/arch/persistence/db/… & stackoverflow.com/questions/32274231/… 用于“批量”插入的“粗略”示例。线程应该不是问题,因为您应该在 io 线程上调用您的 dao,所有这些工作将在第一次使用时运行
标签: android android-room