在 Realm 移动平台中使用相同的主键进行初始同步和复制对象



我正在尝试在已经包含一些数据且已经存在于服务器上的设备上打开领域同步。当新用户连接到领域时,它应该将本地领域数据与同步的领域数据合并。但此代码是在初始同步发生之前启动的。由于尚未收到来自服务器的数据,因此应用程序会在同步领域中创建一些记录。同步完成后,我两次看到相同的数据。我刚刚创建的记录和从服务器获取的数据。使用相同的主键。

有关示例,请参阅下面的代码:

RLMRealmConfiguration *config = [[RLMRealmConfiguration alloc] init];
config.syncConfiguration = [[RLMSyncConfiguration alloc] initWithUser:user realmURL:self.realmURL];
NSError *error = nil;
RLMRealm *newRealm = [RLMRealm realmWithConfiguration:config error:&error];
if(newRealm != nil && error == nil)
{
    [newRealm beginWriteTransaction];
    for(ModelFolder *folder in [ModelFolder allObjectsInRealm:curRealm])
    {
        ModelFolder *newFolder = [ModelFolder objectInRealm:newRealm forPrimaryKey:folder.uuid];
        if(newFolder == nil)
            [ModelFolder createInRealm:newRealm withValue:folder];
    }
    [newRealm commitWriteTransaction];
}

有没有办法检测,该领域已完成初始同步?

UPD:还有一些细节。

ModelFolder包含@property RLMArray<ModelBookmark *><ModelBookmark> *bookmarks;当我创建文件夹时,这等于将在几秒钟内正确合并的某个文件夹。但。文件夹对象中的书签没有重复数据删除,我们得到这样的结果:

RLMResults <0x802082d0> (
 [0] ModelFolder {
  uuid = 2615AB34-1C08-4E7B-8D49-6E02EDBCDF89;
  name = (null);
  descr = (null);
  shareURL = (null);
  date = 1484566331137;
  bookmarks = RLMArray <0x806c78d0> (
   [0] ModelBookmark {
    uuid = C752FCEB-65CB-47C8-8CF4-6CA44C119ECC;
    name = (null);
    descr = (null);
    shareURL = (null);
    date = 1484566331137;
    folderUuid = 2615AB34-1C08-4E7B-8D49-6E02EDBCDF89;
    longitude = 27.54834598813616;
    latitude = 53.91333128839566;
    mapZoom = 11.73785983313041;
    category = 0;
    visible = 1;
   },
   [1] ModelBookmark {
    uuid = C752FCEB-65CB-47C8-8CF4-6CA44C119ECC;
    name = (null);
    descr = (null);
    shareURL = (null);
    date = 1484566331137;
    folderUuid = 2615AB34-1C08-4E7B-8D49-6E02EDBCDF89;
    longitude = 27.54834598813616;
    latitude = 53.91333128839566;
    mapZoom = 11.73785983313041;
    category = 0;
    visible = 1;
   }
  );
  tracks = RLMArray <0x806fb120> (
  );
  opened = 1;
 }
)

不幸的是,目前不支持合并有序列表(直到实现 https://github.com/realm/realm-core/issues/1206)。现在,您必须手动删除重复的列表项,您可以使用我们在 RealmTasks 应用程序中使用的相同解决方法,请参阅 https://github.com/realm/RealmTasks/pull/180 以了解实现细节。

最新更新