【问题标题】:Why is my fetchRequest returning nil?为什么我的 fetchRequest 返回 nil?
【发布时间】:2016-05-28 19:26:28
【问题描述】:

我的 fetch 请求从一个我认为我已成功将数据放入其中的实体返回 nil,经过数小时的调试,我无法弄清楚。 (免责声明:我在 SO 上查看了无数关于获取请求和解包选项的线程,但我发现的每个线程都是关于如何处理解包错误的。我正在寻求帮助以弄清楚为什么我的 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,所以在这一点上我必须假设我只是缺少一些基本的东西。

提前致谢。

【问题讨论】:

  • 嗨 Vadian,managedObjectContext 是一个惰性变量(见下一条评论)...
  • `lazy var managedObjectContext: NSManagedObjectContext = { //返回应用程序的托管对象上下文(它已经绑定到应用程序的持久存储协调器。)此属性是可选的,因为存在合法错误可能导致上下文创建失败的条件。让 coordinator = self.persistentStoreCoordinator var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }()'
  • 是的,但是它是在AppDelegate的范围内声明的,也就是说,它在其他任何地方都不可见。

标签: swift core-data nsfetchrequest


【解决方案1】:

假设您使用的是标准 Core Data 模板,您需要为 LiftLogTableViewController 类中的 managedObjectContext 属性分配一个值。

例如viewDidLoad

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

但是推荐的方法是通过 segue 传递上下文。

【讨论】:

  • 有效!谢谢!我只在 AppDelegate 中懒惰地初始化了它,但在 LiftLogTableViewController 中没有,但我只是像您在上面的代码中看到的那样重新声明了它,这就是问题所在。我使用你的最佳实践技巧通过 segue 传递它并修复它。
  • “redeclare”是一个令人困惑的术语。您声明了 NSManagedObjectContext 类的属性 managedObjectContext,它不一定是 AppDelegate 中声明的实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多