2017-01-16 2 views
1

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; 
} 
) 

Antwort

1

Leider der geordneten Listen Zusammenführung wird derzeit nicht unterstützt (bis https://github.com/realm/realm-core/issues/1206 umgesetzt wird). Bis jetzt müssen Sie Listenelemente manuell deduplizieren. Sie können die gleiche Problemumgehung verwenden, die wir in der RealmTasks-App verwenden. Details zur Implementierung finden Sie unter https://github.com/realm/RealmTasks/pull/180.

+0

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. –

+1

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

Verwandte Themen