Облегченная миграция основных данных и рефлексивные отношения под iOS 5 - PullRequest
2 голосов
/ 18 октября 2011

Начиная с iOS 5 бета-версий я тестировал код моего приложения, и облегченный бит миграции для моей модели Core Data терпел неудачу. Я получаю сообщение об ошибке «нет такого столбца: FOK_REFLEXIVE», но странным образом я получаю его при первом запуске на устройствах и в симуляторе, когда нет более старой версии. Я ничего не изменил со времен iOS 4.x, который прекрасно работал.

Полная ошибка не дает никакой дополнительной информации об ошибке, и после того, как я немного постучал по столу, я, возможно, сузил ошибку до рефлексивных отношений в моей модели данных. Имя имеет отношение «многие ко многим» с «Именем» через отношение «имена». (Идея в том, что Роб связан с Бобом, Робертом и т. Д.). Может ли это внезапно быть запретным в iOS 5?

Кроме того, Core Data проходит через каждую версию модели данных и переносится для каждой независимо от того, какую версию модели данных должно использовать приложение? Странно, если я думаю, что ошибка переноса приложения запускается впервые,

Вот единственный связанный код, хотя это код Маркуса Зарры, который, я полагаю, используют все на Земле.

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

    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Saline.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil] error:&error])
    {
        NSLog(@"Schema changes...");
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return persistentStoreCoordinator_;
}

ОБНОВЛЕНИЕ: полная ошибка следует

2011-10-20 08:14:17.700 Saline[28315:207] CoreData: error: (1) I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE'
2011-10-20 08:14:17.731 Saline[28315:207] Schema changes...
2011-10-20 08:14:17.732 Saline[28315:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134110 "The operation couldn’t be completed. (Cocoa error 134110.)" UserInfo=0x6f7b2d0 {destinationURL=file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, reason=Cannot migrate store in-place: I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE', NSUnderlyingError=0x6f7cda0 "The operation couldn’t be completed. (Cocoa error 134110.)", sourceURL=file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/Saline.sqlite}, {
NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=134110 \"The operation couldn\U2019t be completed. (Cocoa error 134110.)\" UserInfo=0x6f75780 {NSSQLiteErrorDomain=1, NSFilePath=/Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, reason=I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE', NSUnderlyingException=I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE'}";
destinationURL = "file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3";
reason = "Cannot migrate store in-place: I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE'";
sourceURL = "file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/Saline.sqlite";
}

Ответы [ 2 ]

1 голос
/ 20 октября 2011

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

Вы действительно назвали атрибут FOK_REFLEXIVE? Возможно, это хранилище sqlite создается чем-то иным, чем Core Data?

Что такое полная ошибка?

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

UPDATE

Этот действительно указывает на существующий файл. Так как вы работаете в симуляторе, что произойдет, если вы просто посмотрите с помощью консоли?

ls -la /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents

Что ты видишь? Или попробуйте:

find /Users/rob5408/Library/Application Support/iPhone Simulator | grep sqlite

Другой вариант - включить отладку SQL и посмотреть, что выводится. Вы можете сделать это, добавив аргумент -com.apple.CoreData.SQLDebug 3 в ваш исполняемый файл и наблюдая за выводом консоли. Мне было бы интересно увидеть результаты.

1 голос
/ 18 октября 2011

Вы всегда находите решение через две секунды после публикации ...

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

Поэтому я все еще открыт для решения, позволяющего работать с возвратными отношениями в sqlite.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...