Core Data 中计算的持久属性

Posted

技术标签:

【中文标题】Core Data 中计算的持久属性【英文标题】:Calculated persistent property in Core Data 【发布时间】:2014-03-04 11:24:53 【问题描述】:

我在 NSManagedObject 类中有属性 firstNamelastName。我需要另一个属性 uppercaseFirstLetter 从这两个计算。 uppercaseFirstLetter 属性不能是瞬态的,它将用于 sectionNamedKeyPath

[[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest 
                                    managedObjectContext: [DatabaseManager context]
                                      sectionNameKeyPath: @"uppercaseFirstLetter" 
                                               cacheName: nil];   

对于排序描述符

NSSortDescriptor *sortLastNameDescriptor = 
[[NSSortDescriptor alloc] initWithKey: @"uppercaseFirstLetter" 
                            ascending: YES 
                             selector: @selector(localizedStandardCompare:)]; 

这是计算大写首字母的代码:

NSString *aString = nil;
NSString *lastName = [self valueForKey:@"firstName"];
NSString *firstName = [self valueForKey:@"lastName"];

if (lastName.length) 
    aString = [lastName uppercaseString];
 else if (firstName.length) 
    aString = [firstName uppercaseString];
 else 
    aString = @"#";


NSString *stringToReturn = [aString substringToIndex:1];

我需要如何创建 uppercaseFirstLetter 以及应该对代码进行哪些更改才能获得此结果?

【问题讨论】:

您是否考虑过添加自定义 setter 方法?或者NSManagedObject 上的其他方法有什么帮助? 相关:***.com/questions/4874193/core-data-willsave-method 【参考方案1】:

您可以使用firstNamelastName 的自定义设置方法来更新uppercaseFirstLetter 属性:

- (void)setFirstName:(NSString *)firstName

    [self willChangeValueForKey:@"firstName"];
    [self setPrimitiveValue:firstName forKey:@"firstName"];
    [self updateUppercaseFirstLetter];
    [self didChangeValueForKey:@"firstName"];

您还必须为 lastName 执行此操作。

或者您通过 KVO 观察 firstNamelastName 的变化,以便在需要时更新 uppercaseFirstLetter。有很多解决方案如何解决这个问题。关键词:“NSManagedObject”“KVO”

最后一个解决方案可能是更优雅的方式。

【讨论】:

以上是关于Core Data 中计算的持久属性的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤从 Core Data 获取的数据?

Core Data 计算属性总是返回 0

如何根据来自多个 Core Data 属性的计算值进行排序

Core Data 中父实体的计算属性

如何在 Core Data(例如 NSRect)中存储非标准的持久属性?

如何使用带有 Swift 的 Core Data 获取非标准(可转换)属性来更新/保存和持久化?