Ios 核心数据。使用常量文字作为属性名称的NSPredicate问题

Ios 核心数据。使用常量文字作为属性名称的NSPredicate问题,ios,core-data,nspredicate,Ios,Core Data,Nspredicate,我有NSManagedObject和属性。假设一个属性是: @property (retain, nonatomic) NSString *city; 对于从核心数据获取数据,我总是使用NSPredicate。谓词如下所示: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"city", @"San Francisco"]; 但这里的问题是,项目使用键“city”作为未定义的键,其含义类似于常量。

我有
NSManagedObject
和属性。假设一个属性是:

@property (retain, nonatomic) NSString *city;
对于从核心数据获取数据,我总是使用
NSPredicate
。谓词如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"city", @"San Francisco"];
但这里的问题是,项目使用键“city”作为未定义的键,其含义类似于常量。因此,假设我在我的应用程序中使用了1000次密钥“city”,那么如果NSManagedObject的属性发生了更改(例如更改为cityName),我需要用新密钥替换所有这些密钥。在这种情况下,我需要使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"cityName", @"San Francisco"];
不舒服。所以现在我正在使用global
extern NSString键kCity=@“city”但如果数据模型也发生了更改,则会出现问题,因为如果属性发生更改,则只有在运行应用程序和控制台时才会出现崩溃,并显示“我”:

'key path city not found in entity <NSSQLEntity...
所以,若属性被更改,那个么解析器将告诉我项目有错误,我无法运行应用程序。所以,在我更改常量属性之后,我将能够运行应用程序

如何获取NSString中的属性名称。当然,这只是建议,也许有人有另一个变体

谢谢

我使用基于宏的解决方案来避免在需要密钥名称时使用字符串文字

它允许您以这种方式写入密钥名称:

[NSPredicate predicateWithFormat:@"%K = %@", Key(YourManagedObjectSubclass, propertyName), @"aValue"];
编译器将检查ManagedObjectSubclass是否具有给定名称的属性

但当然,请记住,如果您在数据模型中更改属性名称,您仍然需要在NSManagedObject子类中更改它。

您可以使用,它所做的一件事是为您可以使用的属性键和关系键创建一个
结构

// .h
extern const struct MBListAttributes {
    __unsafe_unretained NSString *title;
} MBListAttributes;

// .m
const struct MBListAttributes MBListAttributes = {
    .title = @"title",
};

然后可以使用
mblistatributes.title
获取正确的密钥

有关mogenerator的此功能和其他一些(可能不太为人所知)功能,请参阅。如何使用它。有人可以与安装指南共享链接吗?我已经有了主要的想法,但回购协议中并没有关于如何开始使用它的步骤。也许我错过了什么。此外,我正在使用MagicalRecord,如果由于fetch或其他原因导致MOGENATOR出现故障,它会影响某些部件吗?
// .h
extern const struct MBListAttributes {
    __unsafe_unretained NSString *title;
} MBListAttributes;

// .m
const struct MBListAttributes MBListAttributes = {
    .title = @"title",
};