Миграция с SQLite в комнату,Миграция с SQLite в комнату

Библиотека персистентности Room предоставляет ряд преимуществ по сравнению с прямым использованием API SQLite:

  • Проверка SQL-запросов во время компиляции
  • Удобные аннотации, которые сводят к минимуму повторяющийся и подверженный ошибкам шаблонный код.
  • Оптимизированные пути миграции базы данных

Если ваше приложение в настоящее время использует реализацию SQLite, отличную от Room, прочтите эту страницу, чтобы узнать, как вместо этого перенести свое приложение на использование Room. Если Room — это первая реализация SQLite, которую вы используете в своем приложении, см. раздел Сохранение данных в локальной базе данных с помощью Room для получения базовой информации об использовании.

Этапы миграции

Выполните следующие шаги, чтобы перенести реализацию SQLite в Room. Если ваша реализация SQLite использует большую базу данных или сложные запросы, вы можете предпочесть поэтапный переход на Room. Стратегию поэтапной миграции см. в разделе «Инкрементная миграция ».

Обновить зависимости

Чтобы использовать Room в своем приложении, вы должны включить соответствующие зависимости в файл build.gradle вашего приложения. См. раздел «Настройка» , чтобы узнать о самых последних зависимостях комнаты.

Обновить классы модели до объектов данных

Room использует объекты данных для представления таблиц в базе данных. Каждый класс сущностей представляет таблицу и имеет поля, представляющие столбцы в этой таблице. Выполните следующие шаги, чтобы обновить существующие классы моделей, чтобы они стали объектами комнаты:

  1. Добавьте к объявлению класса аннотацию @Entity , чтобы указать, что это сущность Room. При желании вы можете использовать свойство tableName чтобы указать, что результирующая таблица должна иметь имя, отличное от имени класса.
  2. Аннотируйте поле первичного ключа с помощью @PrimaryKey .
  3. Если какой-либо из столбцов в результирующей таблице должен иметь имя, отличное от имени соответствующего поля, добавьте к этому полю аннотацию @ColumnInfo и задайте для свойства name правильное имя столбца.
  4. Если в классе есть поля, которые вы не хотите сохранять в базе данных, пометьте эти поля аннотацией @Ignore , чтобы указать, что Room не должен создавать для них столбцы в соответствующей таблице.
  5. Если класс имеет более одного метода-конструктора, укажите, какой конструктор Room следует использовать, аннотируя все остальные конструкторы с помощью @Ignore .

Котлин

@Entity(tableName = "users")
data class User(
  @PrimaryKey
  @ColumnInfo(name = "userid") val mId: String,
  @ColumnInfo(name = "username") val mUserName: String?,
  @ColumnInfo(name = "last_update") val mDate: Date?,
)

Ява

@Entity(tableName = "users")
public class User {

  @PrimaryKey
  @ColumnInfo(name = "userid")
  private String mId;

  @ColumnInfo(name = "username")
  private String mUserName;

  @ColumnInfo(name = "last_update")
  private Date mDate;

  @Ignore
  public User(String userName) {
    mId = UUID.randomUUID().toString();
    mUserName = userName;
    mDate = new Date(System.currentTimeMillis());
  }

  public User(String id, String userName, Date date) {
    this.mId = id;
    this.mUserName = userName;
    this.mDate = date;
  }

}

Создание DAO

Room использует объекты доступа к данным (DAO) для определения методов доступа к базе данных. Следуйте инструкциям в разделе «Доступ к данным с помощью Room DAO», чтобы заменить существующие методы запросов на DAO.

Создать класс базы данных

Реализации Room используют класс базы данных для управления экземпляром базы данных. Класс вашей базы данных должен расширять RoomDatabase и ссылаться на все определенные вами сущности и объекты DAO.

Котлин

@Database(entities = [User::class], version = 2)
@TypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Ява

@Database(entities = {User.class}, version = 2)
@TypeConverters(DateConverter.class)
public abstract class UsersDatabase extends RoomDatabase {
  public abstract UserDao userDao();
}

Определите путь миграции

Поскольку номер версии базы данных меняется, необходимо определить объект Migration , чтобы указать путь миграции, чтобы Room сохранял существующие данные в базе данных. Пока схема базы данных не изменится, это может быть пустая реализация.

Котлин

val MIGRATION_1_2 = object : Migration(1, 2) {
  override fun migrate(database: SupportSQLiteDatabase) {
    // Empty implementation, because the schema isn't changing.
  }
}

Ява

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    // Empty implementation, because the schema isn't changing.
  }
};

Дополнительные сведения о путях миграции базы данных в Room см. в разделе Миграция базы данных .

Обновите экземпляр базы данных

После того как вы определили класс базы данных и путь миграции, вы можете использовать Room.databaseBuilder для создания экземпляра вашей базы данных с примененным путем миграции:

Котлин

val db = Room.databaseBuilder(
          applicationContext,
          AppDatabase::class.java, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build()

Ява

db = Room.databaseBuilder(
          context.getApplicationContext(),
          UsersDatabase.class, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build();

Проверьте свою реализацию

Обязательно протестируйте новую реализацию Room:

Инкрементная миграция

Если ваше приложение использует большую и сложную базу данных, миграция всего приложения в Room может быть невозможна. Вместо этого вы можете при желании реализовать объекты данных и базу данных Room в качестве первого шага, а затем позже перенести свои методы запросов в DAO. Это можно сделать, заменив собственный вспомогательный класс базы данных объектом SupportSQLiteOpenHelper , который вы получаете от RoomDatabase.getOpenHelper() .

Дополнительные ресурсы

Чтобы узнать больше о переходе с SQLite на Room, см. следующие дополнительные ресурсы:

Блоги