Поддержка основных данных в приложении на основе страниц

Я создал страничное приложение, которое по умолчанию не поддерживает основные данные (опция не отображается при создании проекта). Итак, я создал второй проект любого типа, который поддерживает базовые данные, и скопировал и пропустил код AppDelegate для поддержки основных данных. Вот:

func saveContext () {
    var error: NSError? = nil
    let managedObjectContext = self.managedObjectContext
    if managedObjectContext != nil {
        if managedObjectContext.hasChanges && !managedObjectContext.save(&error) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            //println("Unresolved error \(error), \(error.userInfo)")
            abort()
        }
    }
}

// #pragma mark - Core Data stack

// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
var managedObjectContext: NSManagedObjectContext {
if !_managedObjectContext {
    let coordinator = self.persistentStoreCoordinator
    if coordinator != nil {
        _managedObjectContext = NSManagedObjectContext()
        _managedObjectContext!.persistentStoreCoordinator = coordinator
    }
    }
    return _managedObjectContext!
}
var _managedObjectContext: NSManagedObjectContext? = nil

// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
var managedObjectModel: NSManagedObjectModel {
if !_managedObjectModel {
    let modelURL = NSBundle.mainBundle().URLForResource("Wink", withExtension: "momd")
    _managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)
    }
    return _managedObjectModel!
}
var _managedObjectModel: NSManagedObjectModel? = nil

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
var persistentStoreCoordinator: NSPersistentStoreCoordinator {
if !_persistentStoreCoordinator {
    let storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("Wink.sqlite")
    var error: NSError? = nil
    _persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    if _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
        /*
        Replace this implementation with code to handle the error appropriately.

        abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

        Typical reasons for an error here include:
        * The persistent store is not accessible;
        * The schema for the persistent store is incompatible with current managed object model.
        Check the error message to determine what the actual problem was.


        If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.

        If you encounter schema incompatibility errors during development, you can reduce their frequency by:
        * Simply deleting the existing store:
        NSFileManager.defaultManager().removeItemAtURL(storeURL, error: nil)

        * Performing automatic lightweight migration by passing the following dictionary as the options parameter:
        [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true}

        Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

        */
        //println("Unresolved error \(error), \(error.userInfo)")
        abort();
    }
    }
    return _persistentStoreCoordinator!
}
var _persistentStoreCoordinator: NSPersistentStoreCoordinator? = nil

Я не сделал никаких изменений в этом.

Теперь я хочу создать экземпляр NSManagedObject:

            var appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate;
            var entity = NSEntityDescription.entityForName(ProfileDataEntityIdentifier, inManagedObjectContext: appDelegate.managedObjectContext);
            var profileData = ProfileData(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext);

Что, конечно, вызывает методы AppDelegate, которые, в свою очередь, вызывают исключение:

 fatal error: unexpectedly found nil while unwrapping an Optional value

Исключение вызывается в методе getOntjectModel в операторе возврата. Изучая код, мне кажется, что копирования и вставки кода недостаточно, потому что, похоже, отсутствует какой-либо ресурс (этот URL-адрес указывает куда-то). Итак, как мне создать этот ресурс? Нужно ли делать что-то еще, чтобы добавить поддержку Core Data?

1 ответ

Решение

Копирование кода недостаточно. Базовые данные требуют модель данных, которая сообщает, как данные настроены. В основном это базовые данные, эквивалентные схеме SQL, за исключением того, что с базовыми данными они помещаются в отдельный файл. Вот на что ссылается URL - он пытается найти файл с именем Wink.mom это представляет модель. Но если в вашем проекте нет файла модели, этот файл не существует.

Вам необходимо добавить в проект файл, соответствующий этому URL. Используйте мастер создания нового файла Xcode, чтобы добавить файл модели Core Data. Дайте ему имя, соответствующее URL, который вы пытаетесь загрузить. Затем отредактируйте файл модели данных, чтобы создать несколько типов сущностей, чтобы у вас была схема для работы.

Другие вопросы по тегам