Objective c 检查N实体描述码是否存在

Objective c 检查N实体描述码是否存在,objective-c,core-data,ios5,nsentitydescription,Objective C,Core Data,Ios5,Nsentitydescription,在尝试设置值之前,我需要检查是否存在NSEntityDescription键。我有一个JSON数据字典,不想尝试设置对象中不存在的键 Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]]; for

在尝试设置值之前,我需要检查是否存在
NSEntityDescription
键。我有一个JSON数据字典,不想尝试设置对象中不存在的键

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
for (id key in dict) {
    // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
}

我认为您是在询问您是否希望检查appointmentObject是否响应属性。在这种情况下:

if([appointmentObject respondsToSelector:NSSelectorFromString(key)])...
getter等价物是propertyName。
setter等价物是setPropertyName。

您不应该检查选择器。设想一个名为
entity
managedObjectContext
的键。NSManagedObject类肯定会对这些选择器做出响应,但是如果您试图为这些选择器分配错误的内容,那么最好的结果就是代码立即崩溃。运气差一点,这样的事情会破坏完整的核心数据文件和所有用户数据

NSEntityDescription
有一个名为的方法,该方法返回一个包含属性名和相应的
nsattributedescription
的字典。因此,这些关键点基本上就是您可以使用的所有属性

像这样的方法应该会奏效:

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
NSArray *availableKeys = [[appointmentObject.entity attributesByName] allKeys];
for (id key in dict) {
    if ([availableKeys containsObject:key]) {
        // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
    }
}
看看这个


BOOL hasFoo=[[myObject.entity properties byname]objectForKey:@“foo”]!=零

这与响应选择器:@selector(键)
相同吗?如果是这样的话,我试过了,但没有成功。键是字符串还是其他类型的对象?我假设它是一个字符串。所有
@属性
都是
NSString
,除了一个
NSNumber
,但是错误是当它遇到一个不在
约会
类中的键时。-1因为检查选择器不是为类似的事情保存的。您可以使用此代码设置
managedObjectContext
,或
实体
。因为您只需检查getter,所以您甚至可以设置类的
描述。至少应用程序会尝试设置它们,但实际设置时会崩溃。你说得很对!因为我依赖JSON响应来提供键,所以它们很可能拥有响应普通选择器的键。太棒了!非常优雅的检查方式。