首页 > 解决方案 > 如何将 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....");
    }
};

标签: androidandroid-sqliteandroid-room

解决方案


尝试这个

   @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


推荐阅读