Сбой при добавлении постоянного хранилища (iCloud включен) в делегат приложения - PullRequest
38 голосов
/ 05 ноября 2011

Я собираюсь начать обновлять это, чтобы помочь тем, кто хочет использовать это как ссылку для их собственного личного кода.

Последнее обновление

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

Еще одно дополнение для правильной настройки

  • Я обнаружил, что после обновления приложения, с которым связаны данные iCloud с учетной записью может вызвать сбой при открытии, потому что iCloud данные будут пытаться слить сразу в устройство (где устройство еще не настроило свое постоянное хранилище). Я сейчас добавил @property (nonatomic, readwrite) BOOL unlocked; до AppDelegate.h и от @synthesize unlocked; до AppDelegate.m. Затем я изменил свой метод - (NSPersistentStoreCoordinator *)persistentStoreCoordinator как а также мой - (void)mergeChangesFrom_iCloud метод, оба из которых будет показано ниже (в середине для постоянной настройки магазина и внизу для метода слияния iCloud). По сути говорю приложение, чтобы предотвратить слияние данных в iCloud, пока приложение не настроено его постоянный магазин. В противном случае вы увидите сбой приложения из-за нечитаемые ошибки.

Вот как я настраиваю свой persistentStoreCoordinator:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }


    // here is where you declare the persistent store is not prepared;
    self.unlocked = NO;

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Maintain_My_Car.sqlite"];

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

    NSPersistentStoreCoordinator *psc = __persistentStoreCoordinator; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSDictionary *options = nil;

        NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:nil];

        NSString *coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];

        if (coreDataCloudContent.length != 0) {
            // iCloud enabled;

            cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];
            options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, @"<bundleIdentifier>.store", NSPersistentStoreUbiquitousContentNameKey, cloudURL, NSPersistentStoreUbiquitousContentURLKey, nil];

        } else {

            // iCloud not enabled;
            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(@"bad things %@ %@", error, [error userInfo]);
            abort();

        }
        [psc unlock];

        // the store is now prepared and ready for iCloud to import data;
        self.unlocked = YES;


        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"iCloud persistent store added");

            [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];

        });
    });

    return __persistentStoreCoordinator;
}

<myAppKey> и <bundleIdentifier>, конечно, являются фактическими значениями. Я просто маскирую их для того, чтобы поделиться этим кодом.

Я знаю, что у некоторых людей все еще возникают проблемы с этим, и они могут использовать этот вопрос в качестве справки о том, как настроить свои собственные приложения Core Data с поддержкой iCloud, поэтому я хочу обновлять его всякий раз, когда я изменяю свой личный код , гарантируя, что вы все можете использовать код, который работает для меня. В этом обновлении я изменил начальный cloudURL с [fileManager URLForUbiquityContainerIdentifier:@"<TeamIdentifier>.<bundleIdentifier>"] на [fileManager URLForUbiquityContainerIdentifier:nil], чтобы обеспечить сбор информации о контейнере из файла разрешений.

Дополнительные методы _notificationArray определяется следующим образом: @property (nonatomice, strong) NSMutableArray *notificationArray; @synthesize notificationArray = _notificationArray;

- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
    if (self.unlocked) {
        NSManagedObjectContext *moc = [self managedObjectContext];

        if (self.notificationArray.count != 0) {
            for (NSNotification *note in _notificationArray) {
                [moc performBlock:^{
                    [self mergeiCloudChanges:note forContext:moc];
                }];
            }
            [_notificationArray removeAllObjects];
            [moc performBlock:^{
                [self mergeiCloudChanges:notification forContext:moc];
            }];
        } else {
            [moc performBlock:^{
                [self mergeiCloudChanges:notification forContext:moc];
            }];
        }
    } else {
        if (_notificationArray == nil) {
            _notificationArray = [[NSMutableArray alloc] init];
        }
        [_notificationArray addObject:notification];
    }
}

- (void)resetStore {
    [self saveContext];
    __persistentStoreCoordinator = nil;
    __managedObjectContext = nil;
    // reset the managedObjectContext for your program as you would in application:didFinishLaunchingWithOptions:
    myMainView.managedObjectContext = [self managedObjectContext];
    // the example above will rebuild the MOC and PSC for you with the new parameters in mind;
}

Тогда есть метод mergeiCloudChanges:forContext::

- (void)mergeiCloudChanges:(NSNotification *)note forContext:(NSManagedObjectContext *)moc {
    // below are a few logs you can run to see what is being done and when;
    NSLog(@"insert %@", [[note userInfo] valueForKey:@"inserted"]);
    NSLog(@"delete %@", [[note userInfo] valueForKey:@"deleted"]);
    NSLog(@"update %@", [[note userInfo] valueForKey:@"updated"]);
    [moc mergeChangesFromContextDidSaveNotification:note];

    NSNotification *refreshNotification = [NSNotification notificationWithName:@"RefreshAllViews" object:self userInfo:[note userInfo]];
    [[NSNotificationCenter defaultCenter] postNotification:refreshNotification];
    // do any additional work here;
}

Начальная проблема

  • Используя iCloud на iOS 5.0.1, я иногда получаю сообщения об ошибках в постоянный магазин. Я собираюсь продолжить обновлять это с новая информация, как я нахожу ее через эксперименты, но до сих пор предоставленное мной решение - единственный способ заставить приложение работать снова правильно (к сожалению, решение jlstrecker не работает для я), как только я начинаю видеть ошибку, которая является следующей:

    -NSPersistentStoreCoordinator addPersistentStoreWithType: конфигурация: URL: опции: ошибка :: CoreData: Ubiquity: Ошибка при попытке прочитать корневой URL-адрес ubiquity: файл: //localhost/private/var/mobile/Library/Mobile%20Documents/./data/. Ошибка: Ошибка Domain = LibrarianErrorDomain Code = 1 "Операция не может быть завершено. (Ошибка LibrarianErrorDomain 1 - Невозможно инициировать загрузку элемента.) "UserInfo = 0x176000 {NSURL = Файл: //localhost/private/var/mobile/Library/Mobile%20Documents/./data/, NSDescription = Невозможно начать загрузку элемента.}

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

    Приложение вылетает здесь:

    if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
    
        NSLog(@"bad things %@ %@", error, [error userInfo]);
        abort();
    
    }
    

    Журнал никогда не сбрасывается и не прерывается. Я просто вижу ошибку выше и само приложение перестает отвечать на запросы. Если кто-то может помочь указать мне в правильном направлении, я был бы очень признателен.

Предыдущие выпуски / вопросы

  • Это похоже на продолжение даже после обновления от бета-версии до публичный релиз 5.0.1. В последний раз это случилось со мной после изменение моей модели данных управляемого контекста. Учитывая, что я не выпустила приложение, я не удосужился объединить новую версию модель. Я просто удалил и переустановил приложение на своих устройствах, но тогда он отказался сотрудничать с данными, хранящимися в iCloud контейнер, под которым я имею в виду, что я получил ошибку, что магазин не удалось загрузить элементы. Я полагаю, это связано с противоречивыми данными типы моделей, что имеет смысл. Так что, кажется, вам просто нужно избавиться от данных в контейнере iCloud, не избавляясь контейнера. Удаление данных iCloud, кажется, убивает все выкл, по сути отключив контейнер и App ID. Так как казалось Проще говоря, я попытался создать новый контейнер, как предложено jlstrecker, но, к сожалению, это совсем не помогло. Итак, еще раз, я должен был пройти шаги, которые я изложил в своем ответе, который снова сделал трюк. Но, учитывая, как это раздражает, чтобы создать новое приложение ID и обновлять профили предоставления каждый раз, я подумал, что лучше обновить то, что я научился, чтобы сузить причину и получить к более быстрому решению.

    Пройдя через iCloud> Хранение и резервное копирование> Управление хранилищем, затем удаление приложения будет лучшим решением для очистки данные, но это, кажется, портит контейнер, приводя к ошибка выше. И после успешного выполнения этого, независимо от того, сколько раз я удаляю приложение и переустанавливаю его на устройство (чтобы оно было появляются, как будто это впервые появляется на устройстве и, надеюсь, создать контейнер), я никогда не смогу показать приложение в Документы и данные снова. Это несколько касается, если это означает, что любой, кто удаляет данные из своего iCloud, означает, что iCloud больше не будет работать для приложения. Я использую только профиль разработки приложения пока что, возможно, с помощью профиль распределения может иметь какое-то значение, но мне придется проверьте это, прежде чем что-то сказать наверняка.

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

Ответы [ 5 ]

13 голосов
/ 07 ноября 2011

Обновленный ответ для повторной синхронизации ваших устройств Месяцы возни заставили меня выяснить, какова (я полагаю) корневая проблема.Проблема заключалась в том, что устройства перестали общаться друг с другом после того, как они перестали синхронизироваться.Я не могу точно сказать, чем это вызвано, но я подозреваю, что журнал транзакций поврежден или (что более вероятно) контейнер самого журнала воссоздан.Это было бы похоже на то, как устройство A отправляет изменения в контейнер A и устройство B, делая то же самое, а не как отправляет сообщения в контейнер C, где они могут читать / записывать в журналы.

Теперь, когда мы знаем проблему, этовопрос создания решения.Дальнейшее возрождение привело меня к следующему.У меня есть метод с именем resetiCloudSync:(BOOL)isSource, который является измененной версией метода, описанного выше в моем первоначальном вопросе.

- (void)resetiCloudSync:(BOOL)isSource {
    NSLog(@"reset sync source %d", isSource);
    NSManagedObjectContext *moc = self.managedObjectContext;

    if (isSource) {
        // remove data from app's cloud account, then repopulate with copy of existing data;

        // find your log transaction container;
        NSURL *cloudURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
        NSString *coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"store"];
        cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];
        NSError *error = nil;

        // remove the old log transaction container and it's logs;
        [[NSFileManager defaultManager] removeItemAtURL:cloudURL error:&error];

        // rebuild the container to insert the "new" data into;
        if ([[NSFileManager defaultManager] createFileAtPath:coreDataCloudContent contents:nil attributes:nil]) {

            // this will differ for everyone else. here i set up an array that stores the core data objects that are to-many relationships; 
            NSArray *keyArray = [NSArray arrayWithObjects:@"addedFields", @"mileages", @"parts", @"repairEvents", nil];

            // create a request to temporarily store the objects you need to replicate;
            // my heirarchy starts with vehicles as parent entities with many attributes and relationships (both to-one and to-many);
            // as this format is a mix of just about everything, it works great for example purposes;
            NSFetchRequest *request = [[NSFetchRequest alloc] init];
            NSEntityDescription *entity = [NSEntityDescription entityForName:@"Vehicle" inManagedObjectContext:moc];
            [request setEntity:entity];
            NSError *error = nil;
            NSArray *vehicles = [moc executeFetchRequest:request error:&error];

            for (NSManagedObject *object in vehicles) {
                NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:object.entity.name inManagedObjectContext:moc];
                // check regular values;
                for (NSString *key in object.entity.attributesByName.allKeys) {
                    [newObject setValue:[object valueForKey:key] forKey:key];
                }

                // check relationships;
                NSMutableSet *relSet = [[NSMutableSet alloc] init];
                for (NSString *key in object.entity.relationshipsByName.allKeys) {
                    [relSet removeAllObjects];

                    // check to see relationship exists;
                    if ([object valueForKey:key] != nil) {

                        // check to see if relationship is to-many;
                        if ([keyArray containsObject:key]) {
                            for (NSManagedObject *toManyObject in [object valueForKey:key]) {
                                [relSet addObject:toManyObject];
                            }
                        } else {
                            [relSet addObject:[object valueForKey:key]];
                        }

                        // cycle through objects;
                        for (NSManagedObject *subObject in relSet) {
                            NSManagedObject *newSubObject = [NSEntityDescription insertNewObjectForEntityForName:subObject.entity.name inManagedObjectContext:moc];
                            // check sub values;
                            for (NSString *subKey in subObject.entity.attributesByName.allKeys) {
                                NSLog(@"subkey %@", subKey);
                                [newSubObject setValue:[subObject valueForKey:subKey] forKey:subKey];
                            }
                            // check sub relationships;
                            for (NSString *subRel in subObject.entity.relationshipsByName.allKeys) {
                                NSLog(@"sub relationship %@", subRel);
                                // set up any additional checks if necessary;
                                [newSubObject setValue:newObject forKey:subRel];
                            }
                        }
                    }
                }   
                [moc deleteObject:object];
            }
            [self resetStore];
        }
    } else {
        // here we remove all data from the current device to populate with data pushed to cloud from other device;
        for (NSManagedObject *object in moc.registeredObjects) {
            [moc deleteObject:object];
        }
    }
    [[[UIAlertView alloc] initWithTitle:@"Sync has been reset" message:nil delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] show];
}

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

Другой (isSource = YES) путь выполняет ряд задач.Как правило, он удаляет поврежденный контейнер.Затем он создает новый контейнер (для журналов, чтобы иметь место для проживания).Наконец, он просматривает родительские объекты и копирует их.То, что это делает, это повторно заполняет контейнер журнала транзакций информацией, которая должна быть там.Затем вам нужно удалить исходные объекты, чтобы у вас не было дубликатов.Наконец, сбросьте постоянное хранилище, чтобы «обновить» основные данные приложения и обновить все представления, и fetchedResultsControllers.

Я могу засвидетельствовать, что это прекрасно работает.Я удалил данные с устройств (isSource = NO), которые не общались с основным устройством (где хранятся данные) в течение нескольких месяцев.Затем я отправил данные с основного устройства и восхитительно наблюдал, как ВСЕ мои данные появились в течение нескольких секунд.

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

Ответ на оригинальный вопрос, который больше не затрагивается после выхода iOS 5.1, который исправил сбой после удаления хранилища iCloud вашего приложения в настройках

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

Итак, суть в том, что если это случится с кем-то еще, следуйте этим шагам, и вы должны быть хороши

  1. Создайте новый идентификатор приложения на портале обеспечения.
  2. Найдите профиль обеспечения, связанный с приложением.Нажмите Edit-> Modify, затем измените ID приложения на тот, который вы только что создали.
  3. Отправьте изменение, затем замените существующий профиль в XCode на тот, который вы только что создали.
  4. Изменить всеэкземпляры <bundleIdentifier> для соответствия новому идентификатору приложения (это будет на главной странице вашего приложения, разрешениях для контейнеров iCloud и хранилища ключей-значений iCloud, а также в вашем файле AppDelegate, где вы создаете постоянное хранилище, как в моемкод выше).
  5. Перезапустите Xcode, так как вы изменили информацию о профилях обеспечения (он будет жаловаться иначе и откажется запускаться на устройстве).
  6. Убедитесь, что новый профиль находится на устройствах, которые вы хотитеустановить приложение, затем собрать и запустить.На этом этапе все должно работать нормально.
7 голосов
/ 20 ноября 2012

Еще одно уточнение: похожая ситуация произошла со мной при тестировании устройств на iOS 6.0.1 и 6.1 beta 2.

Это не полностью исправлено в iOS 5.1, как заявлено @Slev. Одно устройство будет полностью зависать примерно на 80 секунд, пытаясь получить доступ к постоянному хранилищу в iCloud, но никогда не получит доступ к хранящейся там информации.

Я полагаю, это связано с повреждением файла журнала в операционной системе устройства. Удаление приложения или данных iCloud на устройстве не помогло исправить зависание / невозможность доступа к хранилищу iCloud.

Единственное исправление, которое я нашел, было reset all settings (стереть все содержимое тоже работает) на устройстве. settings->general->reset.

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

3 голосов
/ 10 ноября 2011

Я получил эту ошибку при использовании одного устройства на 5.0.1 бета 1 и одного на 5.0.0.

Я избавился от ошибки, изменив имя контейнера iCloud. В списке Контейнеры iCloud первый должен соответствовать идентификатору вашего приложения, но вы можете добавить дополнительные контейнеры с другими именами.

(Как и решение slev по изменению идентификатора приложения, это хорошее решение, если приложение еще не выпущено.)

0 голосов
/ 14 мая 2012

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

Ваш код:

- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
    if (self.unlocked) {
       NSManagedObjectContext *moc = [self managedObjectContext];
        [moc performBlock:^{
            [self mergeiCloudChanges:notification forContext:moc];
        }];
    }
}

Я еще не пробовал, но, глядя на этот код, мне интересно, что происходит с уведомлениями, которые приходят, когда «разблокировано» ложно. Вы бы их потеряли?

Не лучше ли иметь цикл while, который проверяет свойство «разблокировано» и тратить некоторое время, пока свойство не станет истинным?

Надеюсь, вы поймете мой очень плохой английский ... :) Спасибо
Dave

0 голосов
/ 20 февраля 2012

ОБНОВЛЕНИЕ:

Каждый действительно должен взглянуть на сессию 227 iCloud Core Data с WWDC 2012. Исходный код, который они предоставляют, является превосходной отправной точкойдля решения на основе iCloud.На самом деле найдите время, чтобы пройти через то, что они делают.Вам нужно будет заполнить некоторые дыры, такие как копирование объектов из одного магазина в другой и дедупликация.При этом я больше не использую подход migratePersistentStore, как описано ниже, для перемещения между локальными магазинами и магазинами iCloud.


Мой первоначальный ответ:

Слев попросил меня опубликовать код для переноса магазина из локальной копии в iCloud и обратно. Этот код является экспериментальным и не должен использоваться в производстве. Он приведен здесь только в качестве справочного материала, которым мы можем поделиться и двигаться вперед.После того, как Apple выпустит правильное эталонное приложение, вам, вероятно, следует обратиться к нему за рекомендациями и практиками.

-(void) onChangeiCloudSync
{
    YourAppDelegate* appDelegate = (YourAppDelegate*) [[UIApplication sharedApplication] delegate];
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([iCloudUtility iCloudEnabled])
    {
        NSURL *storeUrl = [[appDelegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourApp2.sqlite"];
        NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:nil];
        NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
        cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];

        //  The API to turn on Core Data iCloud support here.
        NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:@"com.yourcompany.yourapp.coredata", NSPersistentStoreUbiquitousContentNameKey, cloudURL, NSPersistentStoreUbiquitousContentURLKey, [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,nil];

        NSPersistentStore* store = [appDelegate.persistentStoreCoordinator.persistentStores objectAtIndex:0];
        NSError* error;
        if (![appDelegate.persistentStoreCoordinator migratePersistentStore:store toURL:storeUrl options:options withType:NSSQLiteStoreType error:&error])
        {
            NSLog(@"Error migrating data: %@, %@", error, [error userInfo]);
            //abort();
        }
        [fileManager removeItemAtURL:[[appDelegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourApp.sqlite"] error:nil];
        [appDelegate resetStore];
    }
    else
    {
        NSURL *storeUrl = [[appDelegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourApp.sqlite"];

        //  The API to turn on Core Data iCloud support here.
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                 [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                                 nil];

        NSPersistentStore* store = [appDelegate.persistentStoreCoordinator.persistentStores objectAtIndex:0];
        NSError* error;
        if (![appDelegate.persistentStoreCoordinator migratePersistentStore:store toURL:storeUrl options:options withType:NSSQLiteStoreType error:&error])
        {
            NSLog(@"Error migrating data: %@, %@", error, [error userInfo]);
            //abort();
        }
        [fileManager removeItemAtURL:[[appDelegate applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourApp2.sqlite"] error:nil];
        [appDelegate resetStore];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...