Как перенести базу данных Android SqLite из внутреннего хранилища в Room? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение с файлом базы данных Sqlite версии 1. Создано с использованием класса 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 . Он возвращает 0 в void 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....");
    }
};

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Миграция не работала из-за PRAGMA user_version .

Я создал базу данных SQLite, используя браузерное программное обеспечение SQLite, и по умолчанию она устанавливает 0 как user_version .

Вот почему я получаю 0 в методе void onCreate(@NonNull SupportSQLiteDatabase db).

Ниже приведен мой код, который я использовал для решения этой проблемы.

@ApplicationScope
@Provides
AppDatabase provideDatabase(Application application) {
    String dbPath;
    if (application.getExternalFilesDir(null) != null) {
        dbPath = application.getExternalFilesDir(null).getPath();
    } else {
        dbPath = application.getFilesDir().getPath();
    }
    dbPath = dbPath + File.separator + DB_NAME;

    try { 
        SQLiteDatabase db = SQLiteHelper.getSqliteHelper(application).getWritableDatabase();
        if (db != null && db.getVersion() == 0) {
            db.execSQL("PRAGMA user_version = 1");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return Room.databaseBuilder(application, AppDatabase.class, dbPath)
            .addMigrations(RoomDatabaseMigrationProvider.MIGRATION_1_2)
            .build();
}
0 голосов
/ 15 мая 2018

Попробуйте это

   @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

...