Uploaded image for project: 'Realm Java SDK'
  1. Realm Java SDK
  2. RJAVA-950

Embedded migrations broke between 10.3.1 and 10.4.0

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • Q2-22FY
    • 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

            Assignee:
            clemente.tort@mongodb.com Clemente Tort Barbero
            Reporter:
            unitosyncbot Unito Sync Bot
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: