Перенести локальные данные ядра в iCloud

Как включить iCloud Core Data в приложении, которое уже использует локальную память Core Data?

Я пытался использовать NSPersistentStoreUbiquitousContentNameKey в моих постоянных опциях хранилища. К сожалению, этот параметр позволяет iCloud, но не передает никакие локальные данные в iCloud. Кажется, я не могу работать с t21. Я предоставляю постоянное хранилище, его URL-адрес, параметры iCloud и т.д., И он по-прежнему не переносит существующие локальные данные в iCloud. Вот как я использую метод:

- (void)migratePersistentStoreWithOptions:(NSDictionary *)options {
    NSError *error;
    self.storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", self.SQLiteFileName]];

    NSPersistentStore *store = [self.persistentStoreCoordinator migratePersistentStore:self.persistentStoreCoordinator.persistentStores.firstObject toURL:self.storeURL options:options withType:NSSQLiteStoreType error:&error];
    if (store) NSLog(@"[CoreData Manager] Store was successfully migrated");
    else NSLog(@"[CoreData Manager] Error migrating persistent store: %@", error);
} 

Локальное хранилище остается отдельно от хранилища iCloud. Если возможно, я хотел бы переместить локальные данные ядра в iCloud без ручной передачи каждого объекта.

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

Ответы

Ответ 1

Здесь вам нужно будет

  • Создайте локальный NSPsistentStoreCoordinator
  • Добавьте существующий постоянный магазин к этому координатору и сохраните ссылку на это новое возвращенное хранилище.
  • Вызовите этот удобный migratePersistStore:... предоставление хранилища из # 2, URL-адрес хранилища в каталоге документов с другим именем файла и всеми важными параметрами, включая ключ NSPersistentStoreUbiquitousContentNameKey.

Здесь код, примечания в строке.

NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

//This is the path to the new store. Note it has a different file name
NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"TestRemote.sqlite"];

//This is the path to the existing store
NSURL *seedStoreURL = [documentsDirectory URLByAppendingPathComponent:@"Test.sqlite"];

//You should create a new store here instead of using the one you presumably already have access to
NSPersistentStoreCoordinator *coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

NSError *seedStoreError;
NSDictionary *seedStoreOptions = @{ NSReadOnlyPersistentStoreOption: @YES };
NSPersistentStore *seedStore = [coord addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:seedStoreURL
                                                         options:seedStoreOptions
                                                           error:&seedStoreError];

NSDictionary *iCloudOptions = @{ NSPersistentStoreUbiquitousContentNameKey: @"MyiCloudStore" };
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//This is using an operation queue because this happens synchronously
[queue addOperationWithBlock:^{
    NSError *blockError;
    [coord migratePersistentStore:seedStore
                            toURL:storeURL
                          options:iCloudOptions
                         withType:NSSQLiteStoreType
                            error:&blockError];

    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    [mainQueue addOperationWithBlock:^{
        // This will be called when the migration is done
    }];
}];

Обратите внимание, что после этой миграции вам необходимо настроить постоянное хранилище, которое вы используете с вашим MOC, с новым URL-адресом и всегда включать iCloudOptions выше с ключом NSPersistentStoreUbiquitousContentNameKey.

Это было основано на документации Apple.

После завершения вы должны увидеть новую папку в папке "Документы" в папке симулятора (~/Library/Application Support/iPhone Simulator/...) с надписью CoreDataUbiquitySupport. Вложенное в глубину ваше хранилище sqlite, синхронизированное с iCloud.

Тада!


EDIT: О, и убедитесь, что вы создали право на iCloud и включили его в свой комплект. Вы должны иметь возможность делать это в Xcode, но вы также можете обновить его на портале разработки.

Ответ 2

Взгляните на это примерное приложение, которое включает в себя код для переноса локального хранилища данных ядра в iCloud и обратно. Лучше всего прочитайте связанные документы и создайте образцы приложений в своей среде, чтобы заставить их работать, и как только они работают, попробуйте и реорганизуйте свой код, чтобы использовать аналогичный подход.

Не стесняйтесь присылать мне электронное письмо для дальнейшей помощи. Извинения за то, что вы не дали вам ответа, но это может быть довольно сложная проблема.

http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/