在 Xamarin.iOS 中将本地领域转换为同步领域时出现异常

Exception when converting local realm to synced realm in Xamarin.iOS

请放心,我已经看到了相同问题的所有答案。 按照这个 link

我有一个本地领域,我想从那里复制到同步领域。

    public void InitiateSyncForPost()
    {

        realm = Realm.GetInstance(ConfigForSync);

        //realm.WriteAsync((Realm obj) =>
        //{

        //    var realmOld = Realm.GetInstance(Config);
        //    var ding = realmOld.All<Post>().ToList();
        //    var dang = realmOld.All<Comment>().ToList();
        //    var ting = realmOld.All<ImageData>().ToList();
        //    foreach (var t in dang)
        //    {
        //        obj.Add(t, false);
        //    }
        //    foreach (var t in ding)
        //    {
        //        obj.Add(t, false);
        //    }
        //foreach (var t in ting)
        //    {
        //        obj.Add(t, false);
        //    }
        //});

            realm.Write(() => {
            var realmOld = Realm.GetInstance(Config);
            var ding = realmOld.All<Post>().ToList();
            var dang = realmOld.All<Comment>().ToList();
            var ting = realmOld.All<ImageData>().ToList();
      
            realmOld.Dispose();
            
            
            foreach (var t in ting)
            {
                realm.Add(t, true);
            }

            foreach (var t in dang)
            {
                realm.Add(t, true);
            }
            foreach (var t in ding)
            {
                realm.Add(t, true);
            }
             
        });

    }

如您所见,我尝试了异步写入和写入方法。 两者都给我例外

当我使用 WriteAsync 时
我得到类似条件不满足数组长度 == 1 的异常(不完全记得)

当我使用当前代码时出现此异常

Realms.Exceptions.RealmObjectManagedByAnotherRealmException: 当一个对象已经被另一个领域管理时,无法开始使用该领域管理对象

我在将对象从本地领域复制到同步领域时做错了什么吗?

您需要创建 非托管 RealmObject 子类的副本 ,然后 将其添加到新领域。

您可以手动或通过辅助扩展执行此操作。

通过 NonManagedCopy 来自 RealmJson.Extensions 的扩展(1):

var nonSyncedRealm = Realm.GetInstance(nonSyncedRealmConfig);
var syncedRealm = Realm.GetInstance(syncedRealmConfig);

var nonSyncedAll = nonSyncedRealm.All<ARealmClass>();
syncedRealm.Write(() =>
{
    foreach (var realmObject in nonSyncedAll)
    {
        var syncedObject = realmObject.NonManagedCopy<ARealmClass>();
        syncedRealm.Add(syncedObject, true);
    }
});

手动复制:

将您的 RealmObject 子类的 each 属性 分配给新实例化的非托管对象。

syncedRealm.Write(() =>
{
   foreach (var realmObject in nonSyncedAll)
   {
        var syncedObject = new ARealmClass
        {
            Id = realmObject.Id,
            Name = realmObject.Name,
            ~~~~~~
            ~~~~~~
            ~~~~~~
            ~~~~~~
        };
        syncedRealm.Add(syncedObject, true);
    }
});

(1) 免责声明 RealmJson.Extensions 是我编写的扩展,可通过 nuget 包或源获得:

回复:https://sushihangover.github.io/Realm.Json.Extensions/