objective-c - 是否有一个好地方来捕获核心数据属性检索以用空字符串覆盖 nil 字符串?

标签 objective-c cocoa core-data magicalrecord mogenerator

我正在将 Core Data 与有点复杂的数据模型结合使用。在很多地方,字符串属性都将被取消设置,并且在这些情况下,当检索属性时,Core Data 显然会返回 nil。我通常希望重写此行为,以便如果数据模型的任何字符串属性返回 nil,它将返回一个空字符串。

除了核心数据之外,我还使用 mogenerator 和 Magical Record。我的数据模型中的所有实体都直接或间接继承自 AbstractEntity,因此我希望我可以编辑 mogenerator 的人员文件以某种方式捕获线路调用,无论它们是否使用 KVC 还是方法调用,并返回如果字符串属性为 nil,则为空字符串。在类似的情况下,如果整数属性为零,我希望返回空字符串。

这可能吗?或者我是否必须单独覆盖每个属性?

最佳答案

听起来您真正想要的是使字符串属性的默认值成为空字符串。在大多数情况下,您可以在核心数据模型编辑器中设置属性的默认值。每当您创建新的托管对象时,该值都会自动分配给该属性。但编辑器不支持使用空字符串作为默认值,因此您不能在那里执行此操作。

不过,您可以在运行时将默认值设置为空字符串。数据模型在您开始使用之前是可编辑的。因此,最好在创建模型对象后立即进行此操作。以下代码将为数据模型中的每个字符串属性分配一个空字符串作为默认值:

- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
    _managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy];

    NSEntityDescription *entityDescription = [_managedObjectModel entitiesByName][@"Entity"];
    for (NSString *attributeName in [entityDescription attributesByName]) {
        NSAttributeDescription *attributeDesc = [entityDescription attributesByName][attributeName];
        if ([attributeDesc attributeType] == NSStringAttributeType) {
            [attributeDesc setDefaultValue:@""];
        }
    }

    return _managedObjectModel;
}

使用这个或类似的东西,当您创建新实例时,模型中的每个字符串属性将自动成为空字符串。如果您不想对每个字符串属性执行此操作,请编辑代码以添加对实体和/或属性名称的一些额外检查。

关于objective-c - 是否有一个好地方来捕获核心数据属性检索以用空字符串覆盖 nil 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20053492/

相关文章:

ios - 在遍历数组时保存到 CoreData

ios - UIViewController 转换与 UIScrollView 到达顶部以启动转换

ios - 如何获得 linkedin 连接?

iphone - Objective-C - 对 NSMutableStrings 使用 deleteCharactersInRange

macos - Qt + CMake for OSX bundle : Cocoa Platform Plugin

cocoa - Mac 应用程序中的 NSUserDefaults

swift - 如何在包含 Objective-C 代码的项目中使用 RxSwift?

iphone - 自定义 "Loading..."UIView

ios - 从相册中选择图像时将图像保存到核心数据

objective-c - 为什么苹果使用 NSOrderedSet 而不是 NSArray 来处理 CoreData 中的有序多值关系?