Ich versuche Realm Sync auf einem Gerät zu aktivieren, das bereits einige Daten enthält, die bereits auf dem Server bestehen. Wenn ein neuer Benutzer eine Verbindung zu realm herstellt, sollte er lokale Realmdaten mit synchronisierten Realmdaten zusammenführen. Dieser Code wird jedoch vor der ersten Synchronisierung gestartet. Da noch keine Daten vom Server empfangen werden, erstellt die App einige Datensätze im synchronisierten Bereich. Wenn die Synchronisierung abgeschlossen ist, sehe ich dieselben Daten zweimal. Datensätze, die ich gerade erstellt und Daten vom Server abgerufen habe. Mit demselben Primärschlüssel.Erstes Synchronisieren und Duplizieren von Objekten mit demselben Primärschlüssel in Realm Mobile Platform
Siehe Code für ein Beispiel:
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];
}
Gibt es eine Möglichkeit zu erkennen, ist, dass Reich erste Synchronisierung abgeschlossen?
UPD: Wenige weitere Details.
ModelFolder
enthält @property RLMArray<ModelBookmark *><ModelBookmark> *bookmarks;
Und wenn ich Ordner erstellen, entspricht das einem Ordner, der in ein paar Sekunden abgerufen wird, die korrekt zusammengeführt werden. Aber. Lesezeichen in Ordner-Objekt nicht dedupliziert und wir bekommen etwas wie folgt aus:
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;
}
)
Gibt es eine Möglichkeit festzustellen, dass die erste Synchronisierung abgeschlossen ist? Ich möchte lieber keine Daten hochladen und dann Duplikate korrigieren, sondern Daten abrufen, Duplikate entfernen und die korrekte Version der Daten hochladen. –
Derzeit nicht, aber es ist etwas, an dem wir arbeiten. Sie können den Fortschritt unter https://github.com/realm/realm-cocoa/pull/4535 verfolgen – Dmitry