Помогите с coredata


#1

Всем привет, коллеги! Какая-то ерунда! Делал совместимость cсredata с ios 9, тестирую и вылазит какой-то баг! Запись в cсredata происходит нормально, а вот чтение что-то не идет! Укажите на мою ошибку!

Код запроса
// Load data from DB
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Children")
        let sortDescriptor = NSSortDescriptor(key: "createDate", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]
        if #available(iOS 10.0, *) {
            if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext {
                fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
                fetchedResultsController.delegate = self            
                var error: NSError?
                var result: Bool
                do {
                    try fetchedResultsController.performFetch()
                    result = true
                } catch let error1 as NSError {
                    error = error1
                    result = false
                }
                childrens = fetchedResultsController.fetchedObjects as! [Child]           
                if result == false {
                    print("описание ошибки \(String(describing: error?.localizedDescription))")
                }
            }
        } else {
            if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext{
                fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
                fetchedResultsController.delegate = self           
                var error: NSError?
                var result: Bool
                do {
                    try fetchedResultsController.performFetch()
                    result = true
                } catch let error1 as NSError {
                    error = error1
                    result = false
                }
                childrens = fetchedResultsController.fetchedObjects as! [Child]              
                if result == false {
                    print("описание ошибки \(String(describing: error?.localizedDescription))")
                }
            }
        }
        print(childrens.count)
    }
AppDelegate
   // MARK: - utility routines
    lazy var applicationDocumentsDirectory: URL = {
        let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return urls[urls.count-1]
    }()
    
    // MARK: - Core Data stack (generic)
    lazy var managedObjectModel: NSManagedObjectModel = {
        let modelURL = Bundle.main.url(forResource: "MyFirstDairy", withExtension: "momd")!
        return NSManagedObjectModel(contentsOf: modelURL)!
    }()
    
    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let url = self.applicationDocumentsDirectory.appendingPathComponent("MyFirstDairy.sqlite")
        
        do {
            try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
        } catch {
            let dict : [String : Any] = [NSLocalizedDescriptionKey        : "Failed to initialize the application's saved data" as NSString,
                                         NSLocalizedFailureReasonErrorKey : "There was an error creating or loading the application's saved data." as NSString,
                                         NSUnderlyingErrorKey             : error as NSError]
            
            let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
            fatalError("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        }
        
        return coordinator
    }()
    
    // MARK: - Core Data stack (iOS 9)
    @available(iOS 9.0, *)
    lazy var managedObjectContext: NSManagedObjectContext = {
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
        return managedObjectContext
    }()
    
    // MARK: - Core Data stack (iOS 10)
    @available(iOS 10.0, *)
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "MyFirstDairy")
        container.loadPersistentStores(completionHandler: {
            (storeDescription, error) in
            if let error = error as NSError?
            {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        }
        )
        
        return container
    }()
    
    // MARK: - Core Data context
    lazy var databaseContext : NSManagedObjectContext = {
        if #available(iOS 10.0, *) {
            return self.persistentContainer.viewContext
        } else {
            return self.managedObjectContext
        }
    }()
    
    // MARK: - Core Data save
    func saveContext () {
        do {
            if databaseContext.hasChanges {
                try databaseContext.save()
            }
        } catch {
            let nserror = error as NSError
            
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }

CoreData iOS < 10
#2

Уберите @available(iOS 10.0, *) и оставьте в AppDelegate:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    let applicationDocumentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let modelURL = Bundle.main.url(forResource: "MyFirstDairy", withExtension: "momd")!
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: NSManagedObjectModel(contentsOf: modelURL)!)
    let url = applicationDocumentsDirectory.last!.appendingPathComponent("MyFirstDairy.sqlite")
    _ = try? coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
    return managedObjectContext
}()

И запрос:

let fetchRequest =  NSFetchRequest<Children>(entityName: "Children")
let sortDescriptor = NSSortDescriptor(key: "createDate", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]

if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext {
    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController.delegate = self
    do {
        try fetchedResultsController.performFetch()
    } catch {
        print(error)
    }
    childrens = fetchedResultsController.fetchedObjects
}

В iOS 10 прекрасно работает то что и в iOS 9, по крайней мере будет проще найти ошибку)


#3

Спасибо Вам огромное! Все получилось!