Salle de ne PAS avoir un bon Système de Migration, au moins pas jusqu'à ce qu' 2.1.0-alpha03
.
Il est prévu d'avoir une meilleure Migration du Système en 2.2.0
Donc, jusqu'à ce que nous avons plus de Système de Migration, il y a quelques solutions de contournement pour avoir facilement des Migrations dans la Chambre.
Comme il n'y a pas une telle méthode @Database(createNewTables = true)
ou MigrationSystem.createTable(User::class)
, ce qui devrait être l'un ou l'autre, la seule voie possible est en cours d'exécution
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
à l'intérieur de votre migrate
méthode.
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
Afin d'obtenir au-dessus de SQL script, vous avez 4 possibilités
1. Écrire par vous-même
Fondamentalement, vous devez écrire le script ci-dessus qui correspond le script de la Pièce génère. De cette façon, est possible, pas possible. (Considérez que vous avez 50 champs)
2. L'Exportation De Schéma
Si vous incluez exportSchema = true
à l'intérieur de votre @Database
d'annotation, Salle de générer schéma de base de données dans /schemas de votre dossier de projet. L'utilisation est
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
//...
}
Assurez-vous que vous avez inclus ci-dessous les lignes en build.grade
de votre application module
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
Lorsque vous exécutez ou de construire le projet, vous obtiendrez un fichier JSON 2.json
, qui a toutes les requêtes à l'intérieur de votre Chambre de la base de données.
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
Donc, vous pouvez inclure le ci-dessus createSql
l'intérieur de vous - migrate
méthode.
3. Requête Get à partir de AppDatabase_Impl
Si vous ne voulez pas exporter le schéma, vous pouvez toujours obtenir la requête en cours d'exécution ou de la construction du projet qui va générer AppDatabase_Impl.java
le fichier. et dans le fichier spécifié, vous pouvez avoir.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
Au sein d' createAllTables
méthode, il faut créer des scripts de toutes les entités. Vous pouvez l'obtenir et de l'inclure dans l'intérieur de vous - migrate
méthode.
4. Annotation Processing.
Comme vous pouvez le deviner, Chambre génère tous les ci-dessus mentionné schema
, et AppDatabase_Impl
fichiers dans le temps de compilation et avec l'Annotation de Traitement qui vous ajoutez à
kapt "androidx.room:room-compiler:$room_version"
Cela signifie que vous pouvez également en faire de même et de faire votre propre annotation de bibliothèque de traitement qui génère tout le nécessaire de créer des requêtes pour vous.
L'idée est de faire une annotation de traitement de la bibliothèque de la Chambre des annotations de l' @Entity
et @Database
. Prendre une classe qui est annotée avec l' @Entity
par exemple. Ce sont ces étapes que vous devrez suivre
- Faire un nouveau
StringBuilder
et l'option "CREATE TABLE if not EXISTS "
- Obtenir le nom de la table, soit à partir d'
class.simplename
ou tableName
domaine de l' @Entity
. Ajouter à votre StringBuilder
- Ensuite, pour chaque domaine de votre classe, de créer des colonnes de SQL. Prendre le nom, le type, la possibilité de valeur null de la zone par le champ lui-même ou par
@ColumnInfo
d'annotation.
Pour chaque champ, vous devez ajouter id INTEGER NOT NULL
style d'une colonne à votre StringBuilder
.
- Ajouter des clés primaires en
@PrimaryKey
- Ajouter
ForeignKey
et Indices
s'il existe.
- Après la fin de la convertir en chaîne et en enregistrer une nouvelle classe que vous souhaitez utiliser. Par exemple, l'enregistrer comme ci-dessous
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
Ensuite, vous pouvez l'utiliser comme
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
J'ai fait une bibliothèque pour moi-même que vous pouvez consulter, et même l'utiliser dans votre projet. Notez que la bibliothèque que j'ai fait n'est pas complète et il répond à mes besoins pour la création de la table.
RoomExtension pour une meilleure Migration
Application qui utilise RoomExtension
Espérons que cela a été utile.