realmrealm-mobile-platformrealm-listrealm-migration

Realm Migration of a String field inside a new RealmList


Conversation class previously had a string field named "message". Now this "message" field is removed and i have added a "RealmList allMessages" inside Conversation class instead of old "message" field. ChatMessage class has a field name "messageText". How can i migrate "message" from Conversation class to "messageText" of list "allMessages"??

public class ChatMessage extends RealmObject implements Parcelable {

    ....

    private String messageText;

    ....
}

Old Conversation class.

public class Conversation extends RealmObject implements Parcelable{

    private String message;
    ....
}

New Conversation class.

public class Conversation extends RealmObject implements Parcelable{

     private RealmList<ChatMessage> allMessages;
}

I tried till this. But it is not working.

        if (oldVersion == 6){
            RealmObjectSchema messageSchema = schema.create("ChatMessage")
                .addField("messageText", String.class);

        RealmObjectSchema userChatSchema = schema.get("Conversation");
        if (userChatSchema != null) {
            userChatSchema.addRealmListField("message_tmp", messageSchema)
                    .transform(new RealmObjectSchema.Function() {
                        @Override
                        public void apply(@NonNull DynamicRealmObject obj) {
                            String message = obj.getString("message");
                            RealmList<DynamicRealmObject> valueObj = obj.getList("message_tmp");
//What next?Am i right till this point??



                        }
                    })
                    .removeField("message")
                    .renameField("message_tmp", "allMessages");
        }
    }

Solution

  • RealmObjectSchema messageSchema = schema.create("ChatMessage")
                    .addField("txt", String.class);
    
            RealmObjectSchema userChatSchema = schema.get("Conversation");
            if (userChatSchema != null) {
                userChatSchema.addRealmListField("message_tmp", messageSchema)
                        .transform(new RealmObjectSchema.Function() {
                            @Override
                            public void apply(@NonNull DynamicRealmObject obj) {
                                String message = obj.getString("message");
    
    
                                RealmList<DynamicRealmObject> valueObj = obj.getList("message_tmp");
                                DynamicRealmObject dynamicRealmObject = realm.createObject("ChatMessage");
                                if (message != null)
                                    dynamicRealmObject.set("txt", message);
                                else
                                    dynamicRealmObject.set("txt", "This message has been deleted");
    
                                valueObj.add(dynamicRealmObject);
    
                            }
                        })
                        .removeField("message")
                        .renameField("message_tmp", "allMessages");
            }