La libreria di persistenza della stanza offre una serie di vantaggi rispetto all'uso di SQLite direttamente le API:
- Verifica in fase di compilazione delle query SQL
- Annotazioni pratiche che riducono al minimo il boilerplate ripetitivo e soggetto a errori codice
- Percorsi di migrazione dei database semplificati
Se al momento la tua app utilizza un'implementazione SQLite diversa dalla stanza, leggi questa pagina per scoprire come eseguire la migrazione della tua app per usare Room. Se la stanza è la prima Per l'implementazione SQLite che utilizzi nella tua app, consulta Salvare i dati in una utilizzando Room per informazioni di base sull'utilizzo.
Passaggi della migrazione
Esegui i seguenti passaggi per eseguire la migrazione dell'implementazione SQLite a Room. Se la tua implementazione SQLite utilizza un database di grandi dimensioni o query complesse, potresti preferire la migrazione a Room gradualmente. Consulta Migrazione incrementale per una strategia di migrazione incrementale.
Aggiorna dipendenze
Per utilizzare Room nella tua app, devi includere le dipendenze appropriate nel
build.gradle
dell'app. Vedi Configurazione per
le dipendenze della stanza più aggiornate.
Aggiorna le classi del modello in entità di dati
La stanza virtuale utilizza le entità dati per: rappresentano le tabelle nel database. Ogni classe entità rappresenta una tabella contiene campi che rappresentano le colonne della tabella. Segui questi passaggi per aggiornare le classi di modello esistenti come entità stanza:
- Annota la dichiarazione della classe con
@Entity
per indicare che si tratta di una Entità stanza. In via facoltativa, puoi utilizzaretableName
in indicare che la tabella risultante deve avere un nome diverso da il nome della classe. - Annota il campo della chiave primaria con
@PrimaryKey
- Se una delle colonne della tabella risultante deve avere un nome
diverso dal nome del campo corrispondente, annota il campo con
@ColumnInfo
e imposta il valorename
alla proprietà il nome della colonna corretto. - Se la classe contiene campi che non vuoi rendere persistenti nel database,
annota questi campi con
@Ignore
per indicare che la stanza non devono creare colonne nella tabella corrispondente. - Se la classe ha più di un metodo costruttore, indica quale costruttore
La stanza virtuale dovrebbe usare annotando tutti gli altri costruttori con
@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; } }
Crea DAO
Room utilizza gli oggetti di accesso ai dati (DAO) per definire i metodi che accedono al database. Segui le indicazioni riportate in Accedere ai dati utilizzando la stanza DAO per sostituire la query esistente con i DAO.
crea una classe di database
Le implementazioni di Room utilizzano una classe di database per gestire un'istanza
per configurare un database. La classe del database deve essere estesa
RoomDatabase
e fai riferimento a tutti
delle entità e dei DAO che hai definito.
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(); }
Definisci un percorso di migrazione
Poiché il numero di versione del database sta cambiando, devi definire un valore
Migration
si oppone a
indicare un percorso di migrazione in modo che la stanza conservi i dati esistenti nel database.
Se lo schema del database non cambia, il campo può essere vuoto.
implementazione.
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. } };
Per scoprire di più sui percorsi di migrazione del database in Room, consulta Eseguire la migrazione di archiviazione.
Aggiorna l'istanza del database
Dopo aver definito una classe di database e un percorso di migrazione, puoi utilizzare
Room.databaseBuilder
per creare un'istanza del tuo database con il percorso di migrazione applicato:
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();
Testare l'implementazione
Assicurati di testare la nuova implementazione delle stanze:
- Segui le indicazioni riportate in Testare migrazioni per testare per la migrazione del database.
- Segui le indicazioni fornite in Testare per testare il tuo DAO di machine learning.
Migrazione incrementale
Se la tua app utilizza un database grande e complesso, potrebbe non essere possibile eseguire la migrazione
la tua app in Room contemporaneamente. Se vuoi, puoi implementare i dati
le entità e il database delle stanze virtuali come primo passaggio, quindi migra i metodi di query
nei DAO in seguito. Per farlo, sostituisci il tuo helper database personalizzato
con
SupportSQLiteOpenHelper
:
che ricevi
RoomDatabase.getOpenHelper()
.
Risorse aggiuntive
Per scoprire di più sulla migrazione da SQLite a Room, consulta le di risorse: