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响应来提供键,所以它们很可能拥有响应普通选择器的键。太棒了!非常优雅的检查方式。