Migracja z SQLite do pokoju

Biblioteka trwałości pokoju ma wiele zalet w porównaniu z bezpośrednim korzystaniem z interfejsów SQLite API:

  • Weryfikacja czasu kompilacji zapytań SQL
  • Wygodne adnotacje, które minimalizują powtarzalny i podatny na błędy kod stały.
  • Uproszczone ścieżki migracji bazy danych

Jeśli Twoja aplikacja korzysta obecnie z implementacji SQLite innej niż sala, przeczytaj tę stronę, aby dowiedzieć się, jak przenieść aplikację do obsługi Rooma. Jeśli Room jest pierwszą implementacją SQLite, której używasz w swojej aplikacji, przeczytaj sekcję Zapisywanie danych w lokalnej bazie danych za pomocą funkcji Room (w języku angielskim), aby zapoznać się z podstawowymi informacjami o korzystaniu.

Etapy migracji

Wykonaj poniższe czynności, aby przenieść implementację SQLite do pomieszczenia. Jeśli Twoja implementacja SQLite korzysta z dużej bazy danych lub złożonych zapytań, możesz stopniowo przejść do interfejsu Room. Informacje o przyrostowej strategii migracji znajdziesz w artykule Migracja przyrostowa.

Zaktualizuj zależności

Aby używać funkcji Room w swojej aplikacji, musisz umieścić odpowiednie zależności w pliku build.gradle aplikacji. Najbardziej aktualne informacje o zależnościach sal znajdziesz w artykule Konfiguracja.

Zaktualizowanie klas modelu na encje danych

Pokoje używają encji danych do reprezentowania tabel w bazie danych. Każda klasa encji reprezentuje tabelę i zawiera pola, które reprezentują kolumny w tej tabeli. Aby zmienić istniejące klasy modelu w encje dotyczące sal, wykonaj te czynności:

  1. Dodaj do deklaracji klasy @Entity, aby wskazać, że jest to encja dotycząca sali. Opcjonalnie możesz użyć właściwości tableName, aby wskazać, że wynikowa tabela powinna mieć nazwę inną niż nazwa klasy.
  2. Dodaj adnotacje do pola klucza podstawowego za pomocą @PrimaryKey.
  3. Jeśli któraś z kolumn w wynikowej tabeli powinna mieć nazwę różną od nazwy odpowiedniego pola, dodaj do niej adnotację @ColumnInfo i ustaw we właściwości name prawidłową nazwę kolumny.
  4. Jeśli klasa zawiera pola, których nie chcesz utrwalać w bazie danych, dodaj do nich adnotacje @Ignore, aby wskazać, że sala nie powinna tworzyć dla nich kolumn w odpowiedniej tabeli.
  5. Jeśli klasa ma więcej niż 1 metodę konstruktora, wskaż konstruktorowi, którego ma używać, dodając do wszystkich pozostałych konstruktor adnotacje @Ignore.

Kotlin

@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?,
)

Java

@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;
  }

}

Tworzenie DAO

Sala używa obiektów dostępu do danych (DAO) do definiowania metod korzystających z bazy danych. Postępuj zgodnie ze wskazówkami w artykule Uzyskiwanie dostępu do danych za pomocą funkcji DAO dla sal, aby zastąpić dotychczasowe metody zapytań danymi DAO.

Utwórz klasę bazy danych

Implementacje pokoju używają klasy bazy danych do zarządzania instancją bazy danych. Klasa bazy danych powinna rozszerzać zakres RoomDatabase i odwoływać się do wszystkich zdefiniowanych przez Ciebie encji i DAO.

Kotlin

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

Java

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

Zdefiniuj ścieżkę migracji

Ponieważ numer wersji bazy danych się zmienia, musisz zdefiniować obiekt Migration, aby wskazać ścieżkę migracji. Dzięki temu pokój zachowa dotychczasowe dane w bazie danych. Dopóki schemat bazy danych się nie zmieni, implementacja może być pusta.

Kotlin

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

Java

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

Więcej informacji o ścieżkach migracji bazy danych w pokoju znajdziesz w artykule Migracja bazy danych.

Zaktualizuj instancję bazy danych

Po zdefiniowaniu klasy bazy danych i ścieżki migracji możesz użyć Room.databaseBuilder, aby utworzyć instancję bazy danych z zastosowaną ścieżką migracji:

Kotlin

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

Java

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

Testowanie implementacji

Przetestuj nową implementację sal:

  • Aby przetestować migrację bazy danych, postępuj zgodnie ze wskazówkami podanymi w artykule Testowanie migracji.
  • Aby przetestować metody DAO, postępuj zgodnie ze wskazówkami podanymi w artykule Testowanie bazy danych.

Migracja przyrostowa

Jeśli aplikacja korzysta z dużej, złożonej bazy danych, migracja całej aplikacji do pokoju może nie być możliwa. Zamiast tego możesz w pierwszej kolejności wdrożyć encje danych i bazę danych sal, a później przenieść do nich metody zapytań. Możesz to zrobić, zastępując niestandardową klasę pomocniczą bazy danych obiektem SupportSQLiteOpenHelper otrzymanym z RoomDatabase.getOpenHelper().

Dodatkowe materiały

Aby dowiedzieć się więcej o migracji z SQLite do Room, zapoznaj się z tymi dodatkowymi materiałami:

Blogi