Вопрос по ios, migration – iOS: перенос существующей базы данных Core Data в iCloud

6

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

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<DB_Name>.sqlite"];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

NSPersistentStoreCoordinator* psc = persistentStoreCoordinator_;

if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSFileManager *fileManager = [NSFileManager defaultManager];

        // Migrate datamodel
        NSDictionary *options = nil;

        // this needs to match the entitlements and provisioning profile
        NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"<App_Identifier>"];
        NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
        if ([coreDataCloudContent length] != 0) {
            // iCloud is available
            cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];

            options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                       @"<App_Name>.store", NSPersistentStoreUbiquitousContentNameKey,
                       cloudURL, NSPersistentStoreUbiquitousContentURLKey,
                       nil];
        } else {
            // iCloud is not available
            options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                       nil];
        }

        NSError *error = nil;
        [psc lock];
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }
        [psc unlock];

        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"asynchronously added persistent store!");
            [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
        });

    });

} else {
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                             nil];

    NSError *error = nil;
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
}

return persistentStoreCoordinator_;
}

С этим кодом всеnew added Записи данных автоматически синхронизируются между всеми iOS-устройствами, так что работает именно так, как должно!

Но то, что я хочу, это такжеall the existing записи данных синхронизируются между всеми устройствами; это пока не работает. Существующие записи все еще доступны в приложении и могут использоваться, но они не синхронизированы.

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

migratePersistentStore:toURL:options:withType:error:

но безуспешно

Я очень благодарен за любую помощь!

Вам нужен специальный код для переноса существующих данных. Гугл вокруг - уже были решения. Вы также можете проверить эту ветку на форуме Apple Developer -devforums.apple.com/thread/126670?tstart=0 у вас должен быть действительный идентификатор разработчика для доступа к нему. Сначала посмотрите в конец потока (он довольно длинный). Kostiantyn Sokolinskyi

Ваш Ответ

2   ответа
0

ика называется посевом. Найдите пример кода наhttps://github.com/jab5990/TestCDiCloud/tree/master/Shared

1

ают это в заключительном разделе, под темой посева. У них также есть некоторый пример кода, который вы можете получить с сайта, на котором есть пример. Короче говоря, вам нужно будет открыть 2 постоянных хранилища, установить размер выборки, затем извлечь пакеты из источника, пройти через них и добавить их в новое хранилище, а через интервалы размера пакета сохранить и сбросить. Довольно просто

Похожие вопросы