Дублирование данных при переносе PersistentStoreCoordinator с локального устройства на iCloud

Я делаю синхронизацию iCloud с основными данными, работает нормально. Теперь я хочу добавить переключатель включения/выключения (перенести хранилище). Если я переношу хранилище в iCloud на локальный, все работает нормально, но если я переношу обратно в iCloud, данные дублируются. Даже я пытался удалить вездесущий контейнер перед миграцией, но это не помогло. Я не смог выполнить дедупликацию, потому что метод StoreDidImportUbiquitousContent не вызывался после дублирования данных.

Код ниже:

        // Migrate to local 

    -(NSURL *)localStoreURL
    {
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"LocalExpns.sqlite"];
        return storeURL;

    }

  - (void)moveStoreToLocal
{      
         NSError *error = nil;
            NSPersistentStoreCoordinator * persistentStoreCoordinator = self.persistentStoreCoordinator;

            NSPersistentStore * persistentStore = [[persistentStoreCoordinator persistentStores] firstObject];

            if([[NSFileManager defaultManager]fileExistsAtPath:[self localStoreURL].path])
            {
                NSLog(@"File exists");
                [[NSFileManager defaultManager] removeItemAtPath:[self localStoreURL].path error:& error];
                NSLog(@"Removing error = %@", error);

            }

            NSMutableDictionary *localStoreOptions = [[self localStoreOptions] mutableCopy];
            [localStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSPersistentStoreRemoveUbiquitousMetadataOption];

           id result = [persistentStoreCoordinator migratePersistentStore:persistentStore toURL:[self localStoreURL] options:localStoreOptions withType:NSSQLiteStoreType error:&error];

}

Код выше работает нормально.

// Миграция обратно в iCloud

// fileURL — это адрес локального файла

-(NSURL *)storeURL
{
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Expns.sqlite"];
    return storeURL;
}


    - (void)moveStoreFileToICloud:(NSURL*)fileURL 
    {
     NSPersistentStoreCoordinator * persistentStoreCoordinator = self.persistentStoreCoordinator;

            id sourceStore = [[persistentStoreCoordinator persistentStores] firstObject];

            if (!sourceStore) {

                NSLog(@" failed to add old store");

            } else {
                NSLog(@" Successfully added store to migrate");

                bool moveSuccess = NO;
                NSError *error;


                NSLog(@" About to migrate the store...");
                // Now migrate the store using the iCloud options
                id migrationSuccess = [self.persistentStoreCoordinator migratePersistentStore:sourceStore toURL:[self storeURL] options:[self icloudStoreOptions] withType:NSSQLiteStoreType error:&error];

                if (migrationSuccess) {
                    moveSuccess = YES;
                    NSLog(@"store successfully migrated");

                    // Now delete the local file
                    if (shouldDelete) {
                        NSLog(@" deleting local store");
                        [self deleteLocalStore];
                    } else {
                        NSLog(@" not deleting local store");
                    }
                }
                else {
                    NSLog(@"Failed to migrate store: %@, %@", error, error.userInfo);
                }

            }
    }

Теперь данные дублируются до переноса. Я попытался удалить вездесущий контейнер, также не помогло.


person Mohanadevi    schedule 17.07.2015    source источник
comment
Фактически вы дважды добавляете данные в облако, поэтому и получаете дубликаты. Рекомендуемый способ справиться с этим — удалить дубликаты ваших данных после синхронизации. Поиск Google даст вам код для этого. Вот один из них: atomicbird.com/blog/icloud-complications-part-2   -  person Drew McCormack    schedule 17.07.2015
comment
Привет @DrewMcCormack, спасибо за ответ. я пробовал это также, он говорит о дедупликации в Storeidimport:. Он отлично работает, когда у меня есть два устройства. Если у меня хранится только одно устройство, метод dimport: не вызывается и данные дублируются.   -  person Mohanadevi    schedule 18.07.2015
comment
Хм, ты уверен? Я бы подумал, что NSPersistentStoreDidImportUbiquitousContentChangesNotification будет публиковаться всякий раз, когда фоновое изменение было внесено в хранилище для синхронизации. Я думаю, что если вы дедуплицируете там, это всегда должно работать.   -  person Drew McCormack    schedule 22.07.2015
comment
@DrewMcCormack при изменении хранилища с локального на iCloud (при использовании одного устройства) NSPersistentStoreDidImportUbiquitousContentChangesNotification не вызывается (это вызовет после изменения записи iCloud sdk, верно?). Теперь у меня есть дедупликация записи при извлечении данных. Я знал, что это не очень хороший способ, но он работает. У вас есть идея получше?   -  person Mohanadevi    schedule 22.07.2015


Ответы (1)


Я решил эту проблему, дедуплицировав мою базу данных вручную, как это

person Mohanadevi    schedule 07.08.2015