【问题标题】:Check if NSEntityDescription key exists检查 NSEntityDescription 键是否存在
【发布时间】:2023-03-30 06:16:02
【问题描述】:

在尝试设置值之前,我需要检查是否存在 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];
}

【问题讨论】:

    标签: objective-c core-data ios5 nsentitydescription


    【解决方案1】:

    我认为您是在询问是否要检查约会对象是否响应属性。在这种情况下:

    if([appointmentObject respondsToSelector:NSSelectorFromString(key)])...
    

    getter 等效项是 propertyName。 setter 等效项是 setPropertyName。

    【讨论】:

    • 这和respondsToSelector:@selector(key)一样吗?如果是这样,我试过了,但没有用。
    • 键是字符串还是其他类型的对象?我以为它是一个字符串。
    • 所有@property 都是NSString,除了NSNumber,但是错误是遇到不在Appointment 类中的键。
    • -1 因为检查选择器不会保存这样的东西。您可以使用此代码设置managedObjectContextentity。而且因为您只需检查 getter,您甚至可以设置类的 description。至少应用会尝试设置它们,并在实际设置时崩溃。
    【解决方案2】:

    你不应该检查选择器。想象一个名为entitymanagedObjectContext 的密钥。 NSManagedObject 类肯定会响应这些选择器,但是如果您尝试将错误分配给这些选择器,那么最好的事情就是您的代码会立即崩溃。运气差一点,这样的事情会破坏完整的核心数据文件,以及所有的用户数据。

    NSEntityDescription 有一个名为attributesByName 的方法,它返回一个包含您的属性名称和对应的NSAttributeDescriptions 的字典。所以这些键基本上是你可以使用的所有属性。

    这样的事情应该可以工作:

    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];
        }
    }
    

    【讨论】:

    • 你说得很好!由于我依赖 JSON 响应来提供键,因此它们很有可能拥有响应普通选择器的键。
    【解决方案3】:

    检查一下,

    BOOL hasFoo = [[myObject.entity propertiesByName] objectForKey:@"foo"] != nil;

    【讨论】:

    • 太棒了!非常优雅的检查方式。
    猜你喜欢
    • 2015-12-04
    • 2012-09-08
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多