每当我尝试更新核心数据模型的值时,我都会不断收到此错误。这是我的模特
import Foundation import CoreData @objc(Habit) class Habit: NSManagedObject { @NSManaged var name: String @NSManaged var trackingType: NSNumber }
这是我的代码tableViewCell
override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { self.accessoryType = UITableViewCellAccessoryType.Checkmark if self.habit? != nil { self.habit?.trackingType = index } } else { self.accessoryType = UITableViewCellAccessoryType.None } // Configure the view for the selected state }
我不断收到错误消息 “由于未捕获的异常’NSInvalidArgumentException’而终止应用程序,原因:’-[Habit setTrackingType:]:无法识别的选择器发送到实例0x7fdcbb002c90’”
在self.habit?.trackingType = index行
我正在努力解决最近2天的问题。
编辑:
用以下方式初始化模型习惯
func getHabits() -> [AnyObject]{ let entityDescription = NSEntityDescription.entityForName("Habit", inManagedObjectContext: managedObjectContext!) let request = NSFetchRequest() request.entity = entityDescription // // let pred = NSPredicate(format: "(trackingType != -1)") // request.predicate = pred var error: NSError? var objects = managedObjectContext?.executeFetchRequest(request, error: &error) return objects!; }
返回的列表可在应用程序中的任何地方使用。基本上,我从列表中获取项目并更新其属性,然后再次保存
好的,因此得到错误的原因很可能是因为所引用的对象self.habit不是Habit对象。找出对象实际的最简单方法是调用:
self.habit
Habit
print(NSStringFromClass(habit.class))
对于核心数据和自定义,NSManagedObjects您需要确保实体:“习惯”(在数据模型中)具有设置为“习惯”的类。这可以确保Core Data将具有“ Habit”的实体描述的获取的对象强制转换为Habit类。如果您不这样做,则getHabits函数将返回NSManagedObjects 的数组而不是s的数组。Habit如果是这种情况,则代码:println(NSStringFromClass(habit.class))将向调试器输出“ NSManagedObject”。
NSManagedObjects
getHabits
NSManagedObject
println(NSStringFromClass(habit.class))
附带说明,从Core Data数据库获取对象时,您确实需要检查错误。添加行:
if objects? == nil { print("An error occurred \error.localisedDescription") }
如果有任何错误,请原谅我,我通常使用Objective-C。
编辑:为了纠正Failed to call designated initializer on NSManagedObject class 'X'错误。如果未正确实例化,则会引发此错误NSManagedObject。您一定不能打电话[[MyManagedObject alloc] init];,initWithEntity:insertIntoManagedObjectContext而必须打电话:
Failed to call designated initializer on NSManagedObject class 'X'
[[MyManagedObject alloc] init];
initWithEntity:insertIntoManagedObjectContext
MyManagedObject *obj = [[MyManagedObject alloc] initWithEntity:[NSEntityDescription entityForName:@"MyManagedObject" inManagedObjectContext:context] insertIntoManagedObjectContext:context];
如果您不希望将对象obj插入上下文,则可以通过nil上下文参数传递。但是,如果要撤消管理并具有将对象保存到数据库的功能,则需要将其与上下文关联。
obj
nil
如果要自定义对象的初始化,则可以覆盖awakeFromInsert和awakeFromFetch方法/函数。
awakeFromInsert
awakeFromFetch