-
Type: Bug
-
Resolution: Done
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: None
Goal
Fix previous functioning schema migrations in our application.
Actual Results
Running our migrations creates the following error. On 10.3.1, these exact migrations run just fine - they only started causing a problem on 10.4.0.
java.lang.IllegalStateException: Cannot change table to embedded without backlink columns. Table must be embedded in at least one other table. at io.realm.internal.Table.nativeSetEmbedded(Native Method) at io.realm.internal.Table.setEmbedded(Table.java:725) at io.realm.RealmObjectSchema.setEmbedded(RealmObjectSchema.java:459) at com.blueapron.service.cache.MigrationManager$UpgradeFrom108.migrate(MigrationManager.java:1092) at com.blueapron.service.cache.MigrationManager.migrate_inner(MigrationManager.java:131) at com.blueapron.service.cache.MigrationManager.migrate(MigrationManager.java:116) at io.realm.BaseRealm$6.onMigrationNeeded(BaseRealm.java:867)
Steps & Code to Reproduce
We are running a migration that adds a new class called Image, and wants it to be embedded. The migration code looks like this:
private class UpgradeFrom108 extends BaseMigration { UpgradeFrom108() { super(108); } @Override public boolean migrate(DynamicRealm realm) { RealmSchema schema = realm.getSchema(); RealmObjectSchema imageSchema = schema.create("Image") .addField("url", String.class) .addField("alt_text", String.class); imageSchema.setEmbedded(true); RealmObjectSchema basicContentSchema = schema.create("BasicContent") .addField("title", String.class) .addField("target_url", String.class) .addRealmObjectField("image", imageSchema); basicContentSchema.setEmbedded(true); RealmObjectSchema variantSchema = Objects.requireNonNull(schema.get("Variant")); RealmObjectSchema contentStreamCardSchema = schema.create("ContentStreamCard") .addField("analytics_event", String.class) .addField("display_priority", int.class) .addField("style", int.class) .addField("title", String.class) .addRealmObjectField("basic_content", basicContentSchema) .addRealmObjectField("variant", variantSchema) .addField("content_type", int.class); contentStreamCardSchema.setEmbedded(true); RealmObjectSchema contentStreamContainerSchema = schema.create("ContentStreamContainer") .addField("id", String.class) .setRequired("id", true) .addField("display_priority", int.class) .addRealmListField("children", contentStreamCardSchema); contentStreamContainerSchema.setEmbedded(true); schema.create("ContentStream") .addField("id", String.class) .setRequired("id", true) .addPrimaryKey("id") .addRealmListField("containers", contentStreamContainerSchema) .addField("retain", boolean.class); return true; } }
Some of the relevant object schemas are as follows:
@RealmClass(embedded = true) open class Image : RealmObject() { @JvmField var url: String? = null @JvmField var alt_text: String? = null } @RealmClass(embedded = true) open class BasicContent : RealmObject() { @JvmField var body: String? = null @JvmField var target_url: String? = null @JvmField var image: Image? = null } // ... and so forth.
Version of Realm and tooling
Realm version(s): 10.4.0 - Realm 10.3.1 is working just fine.
Realm Sync feature enabled: No
Android Studio version: 4.1.3