为什么我的 fetchRequest 返回 nil?
Why is my fetchRequest returning nil?
我的提取请求从一个我认为我已成功将数据放入其中的实体返回 nil,经过数小时和数小时的调试后,我仍无法弄清楚。 (免责声明:我已经在 SO 上查看了无数讨论获取请求和解包选项的线程,但我发现的每一个都是关于如何处理解包错误的。我正在寻求帮助来弄清楚为什么我的获取请求是在我认为应该的时候返回记录。)
在我要显示数据的视图控制器中,我在 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,所以此时我必须假设我缺少一些基本的东西。
提前致谢。
假设您使用的是标准核心数据模板,您需要为 LiftLogTableViewController
class.[=14= 中的 managedObjectContext
属性 赋值]
例如 viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
managedObjectContext = appDelegate.managedObjectContext
}
然而,推荐的方法是通过 segue 传递上下文。
我的提取请求从一个我认为我已成功将数据放入其中的实体返回 nil,经过数小时和数小时的调试后,我仍无法弄清楚。 (免责声明:我已经在 SO 上查看了无数讨论获取请求和解包选项的线程,但我发现的每一个都是关于如何处理解包错误的。我正在寻求帮助来弄清楚为什么我的获取请求是在我认为应该的时候返回记录。)
在我要显示数据的视图控制器中,我在 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,所以此时我必须假设我缺少一些基本的东西。
提前致谢。
假设您使用的是标准核心数据模板,您需要为 LiftLogTableViewController
class.[=14= 中的 managedObjectContext
属性 赋值]
例如 viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
managedObjectContext = appDelegate.managedObjectContext
}
然而,推荐的方法是通过 segue 传递上下文。