android - 如何将 Android SqlLite 数据库从内部存储迁移到 Room?
问题描述
我有一个具有版本 1 的 Sqlite 数据库文件的应用程序。它是使用SqliteOpenHelper类创建的。
现在我想将旧数据库迁移到房间数据库。
下面是我的代码,它似乎对我不起作用。
@ApplicationScope
@Provides
AppDatabase provideDatabase(Application application) {
String dbPath = "";
if (application.getExternalFilesDir(null) != null) {
dbPath = application.getExternalFilesDir(null).getPath();
} else {
dbPath = application.getFilesDir().getPath();
}
return Room.databaseBuilder(application, AppDatabase.class, dbPath + File.separator + DB_NAME)
.addMigrations(RoomDatabaseMigrationProvider.MIGRATION_1_2)
.build();
}
上面的代码没有调用RoomDatabaseMigrationProvider.MIGRATION_1_2。我还尝试添加RoomDatabase.Callback。它在返回 0void onCreate(@NonNull SupportSQLiteDatabase db)
而不是版本 1 和void onOpen(@NonNull SupportSQLiteDatabase db)
方法中返回版本 2。
下面是我的 AppDatabase.java 和迁移类
@Database(entities = {Calendar.class, Contest.class},
version = 2, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public abstract ContestDao provideContestDao();
public abstract CalanderDao provideCalanderDao();
}
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull final SupportSQLiteDatabase database) {
Log.d("##### Migration", "started....");
migrateDatabase(database);
Log.d("##### Migration", "completed....");
}
};
解决方案
尝试这个
@Database(entities = {<all entity classes>},
version = <incremented_sqlite_version>)
public abstract class AppDatabase extends RoomDatabase {
private static UsersDatabase INSTANCE;
static final Migration MIGRATION_<sqlite_version>_<incremented_sqlite_version>
= new Migration(<sqlite_version>, <incremented_sqlite_version>) {
@Override public void migrate(
SupportSQLiteDatabase database) {
// Since we didn’t alter the table, there’s nothing else
// to do here.
}
};
以供参考:
https://medium.com/google-developers/incrementally-migrate-from-sqlite-to-room-66c2f655b377
推荐阅读
- hive - 在 Hive 中,如何组合多个表以生成包含对象数组的单行?
- php - clouser函数没有在类文件中调用
- azure-active-directory - 使用图形 api 查询第三方 azure AD 的 AD 应用程序注册或企业应用程序?
- php - PHP 从表 1 中选择并插入表 2,表 2 上的 id 返回为 0
- java - 如何设置mysql的时区?
- reactjs - “TypeError:无法使用 chrome-devtools 读取未定义的属性 'pseudoType'”
- reactjs - 如何在反应中解决 1 not === 1
- python - 动画子类
- javascript - 如何修复“window.minimize() 不是函数”?
- android-tv - 无法使用 ArrayObjectAdaptor 的 clear() 和 addAll() 刷新/更新浏览片段