如何从 NSManagedObject 属性 派生核心数据属性键?
How to Derive a Core Data Attribute Key from an NSManagedObject Property?
有没有办法直接从相应 NSManagedObject
的 属性 中检索核心数据实体属性的键?这将消除某些情况下对基于字符串 ('stringly-typed') 代码的依赖,从而降低出错的风险。
例如,我想替换以下内容:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdDate", ascending: false)]
...还有更多像这样的东西:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: exampleNSManagedObject.createdDate.key, ascending: false)]
我知道 .defaultSortDescriptors
可以用来实现其中的一些功能,但仅限于固定属性。我也知道 .entity.attributesByName.keys
可以用来获取密钥列表,但我还没有建立一种方法来自动隔离相关的。
嗯,当然你可以写一个 NSManagedObject
的扩展,其中包含一个函数,该函数将采用人工编写的字符串和 return .entity.attributesByName.keys
中的最佳匹配,这将解决你所说的问题。
但更好的方法是使用一种工具,它会自动从您的数据模型中生成此类关键常量。查看 mogenerator,这是 Xcode 中内置的 Core Data 代码生成的开源 "pro" 替代品。它的特点之一是为每个实体生成这样的枚举:
public enum MyEntityAttributes: String {
case createdDate = "createdDate"
case foo = "foo"
case bar = "bar"
}
然后您想要的密钥字符串可以访问为 MyEntityAttributes.foo
。
#keyPath 字符串表达式是您要查找的内容吗?来自 docs:
You use the #keyPath string expression to create compiler-checked keys and key paths that can be used by KVC methods
例如:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ExampleNSManagedObject.createdDate), ascending: false)]
有没有办法直接从相应 NSManagedObject
的 属性 中检索核心数据实体属性的键?这将消除某些情况下对基于字符串 ('stringly-typed') 代码的依赖,从而降低出错的风险。
例如,我想替换以下内容:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdDate", ascending: false)]
...还有更多像这样的东西:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: exampleNSManagedObject.createdDate.key, ascending: false)]
我知道 .defaultSortDescriptors
可以用来实现其中的一些功能,但仅限于固定属性。我也知道 .entity.attributesByName.keys
可以用来获取密钥列表,但我还没有建立一种方法来自动隔离相关的。
嗯,当然你可以写一个 NSManagedObject
的扩展,其中包含一个函数,该函数将采用人工编写的字符串和 return .entity.attributesByName.keys
中的最佳匹配,这将解决你所说的问题。
但更好的方法是使用一种工具,它会自动从您的数据模型中生成此类关键常量。查看 mogenerator,这是 Xcode 中内置的 Core Data 代码生成的开源 "pro" 替代品。它的特点之一是为每个实体生成这样的枚举:
public enum MyEntityAttributes: String {
case createdDate = "createdDate"
case foo = "foo"
case bar = "bar"
}
然后您想要的密钥字符串可以访问为 MyEntityAttributes.foo
。
#keyPath 字符串表达式是您要查找的内容吗?来自 docs:
You use the #keyPath string expression to create compiler-checked keys and key paths that can be used by KVC methods
例如:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ExampleNSManagedObject.createdDate), ascending: false)]