Почему мой fetchRequest возвращается nil?

Мой запрос fetch возвращает nil от сущности, в которую я думаю, что я успешно поместил данные, и после многих часов отладки я не смог понять это. (Отказ от ответственности: я посмотрел на бесчисленные темы здесь, так что говорить о fetch запросов и вариантов разворачивания, но каждый из них я нашел о том, как справиться с ошибкой разворачивания. Я прошу помочь выяснить, почему мой запрос fetch не возвращает запись, когда я считаю, что это должно быть.)

В контроллере представления, где я собираюсь отобразить данные, у меня есть это в viewWillAppear:

class LiftLogTableViewController: UITableViewController {

    var managedObjectContext: NSManagedObjectContext!
    var liftEvents = [LiftEvent]() 

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

    let fetchRequest = NSFetchRequest(entityName: "LiftEvent")

    do {
      if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [LiftEvent] {
        liftEvents = results  <---- nil error happening here

        }
    }  catch {
      fatalError("Error fetching data!")
    }
  }

Но я считаю, что там есть запись, потому что в AppDelegate.addData() я сделал это:

    // create a lift event in LiftEvent
    let liftEvent = LiftEvent(entity: liftEventEntity, insertIntoManagedObjectContext: managedObjectContext)

    let dateStr = "05-27-2016"
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MM-dd-yyyy"
    let date: NSDate = dateFormatter.dateFromString(dateStr)!

    liftEvent.date = date
    liftEvent.liftEventUid = 1
    liftEvent.liftUid = 1
    liftEvent.formulaUid = 1
    liftEvent.maxAmount = 250

    print("Added lift ID: (liftEvent.liftEventUid) lift ID: (liftEvent.liftUid) weight: (liftEvent.maxAmount) formula: (liftEvent.formulaUid) ")

    saveContext()

  }

func saveContext () {
    if managedObjectContext.hasChanges {
      do {
        try managedObjectContext.save()
      } catch {
        // 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.
        let nserror = error as NSError
        NSLog("Unresolved error (nserror), (nserror.userInfo)")
        abort()
      }
    }
  }

Я изучаю CoreData, поэтому в этот момент я должен предположить, что есть что-то основное, что я просто пропускаю.

Спасибо заранее.

1 ответ

  1. Предполагая, что используется стандартный шаблон основных данных, необходимо присвоить значение managedObjectContextсвойству в LiftLogTableViewControllerклассе.

    Например в viewDidLoad

    override func viewDidLoad() {
      super.viewDidLoad()
      let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
      managedObjectContext = appDelegate.managedObjectContext
    }
    

    Однако рекомендуемый способ-передать контекст через segue.