Подтвердить что ты не робот

Как решить: "NSPersistentStoreCoordinator не имеет постоянных магазинов"?

Я точно следую этому руководству, добавляя CoreData к существующему приложению: https://www.youtube.com/watch?v=WcQkBYu86h8

Когда я добираюсь до seedPerson() moc.save(), приложение вылетает с этой ошибкой:

CoreData: ошибка: незаконная попытка сохранить файл, который никогда не был открыт. "Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ (Неизвестно). Он не может выполнить операцию сохранения.". записано.

Добавлен NSManagedSubclass.

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

4b9b3361

Ответ 1

Я также следил за этим учебником YouTube и имел ту же проблему. Я просто удалил блок потока фона, который добавляет постоянный магазин, и он сработал. Здесь my DataController:

import UIKit
import CoreData

class WellbetDataController: NSObject {
    var managedObjectContext: NSManagedObjectContext

    override init() {
        // This resource is the same name as your xcdatamodeld contained in your project.
        guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else {
            fatalError("Error loading model from bundle")
        }

        // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
        guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else {
            fatalError("Error initializing mom from: \(modelURL)")
        }

        let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
        self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
        self.managedObjectContext.persistentStoreCoordinator = psc

        let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        let docURL = urls[urls.endIndex-1]
        /* The directory the application uses to store the Core Data store file.
        This code uses a file named "DataModel.sqlite" in the application documents directory.
        */
        let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite")
        do {
            try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
        } catch {
            fatalError("Error migrating store: \(error)")
        }



//        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
//            let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
//            let docURL = urls[urls.endIndex-1]
//            /* The directory the application uses to store the Core Data store file.
//            This code uses a file named "DataModel.sqlite" in the application documents directory.
//            */
//            let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite")
//            do {
//                try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
//            } catch {
//                fatalError("Error migrating store: \(error)")
//            }
//        }
    }
}

Ответ 2

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

Вам нужно использовать отладчик и выполнить код, который создает PSC (метод DataController.init), и посмотреть, почему происходит сбой. Если вы вырезаете/вставляете то же самое, что и в этом примере, возможно, вы также забыли изменить имя своей модели при создании экземпляра модели.

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

Ответ 3

Проблема заключается в этих двух строках:

guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else {

& &

let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite")

DataModel необходимо изменить на имя вашего приложения, если ваш CoreData был автоматически создан Xcode. Найдите эти строки в AppDelegate.swift

Ответ 4


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

Это случилось со мной, и это работает после того, как я это сделал.

Ответ 5

Вам нужно загрузить постоянные магазины

let persistentContainer = NSPersistentContainer(name: "DbName") 
persistentContainer.loadPersistentStores() { [weak self] _, error in      
      self?.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true            
}