Core Data 中计算的持久属性
Posted
技术标签:
【中文标题】Core Data 中计算的持久属性【英文标题】:Calculated persistent property in Core Data 【发布时间】:2014-03-04 11:24:53 【问题描述】:我在 NSManagedObject 类中有属性 firstName 和 lastName。我需要另一个属性 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】:
您可以使用firstName
和lastName
的自定义设置方法来更新uppercaseFirstLetter
属性:
- (void)setFirstName:(NSString *)firstName
[self willChangeValueForKey:@"firstName"];
[self setPrimitiveValue:firstName forKey:@"firstName"];
[self updateUppercaseFirstLetter];
[self didChangeValueForKey:@"firstName"];
您还必须为 lastName
执行此操作。
或者您通过 KVO 观察 firstName
和 lastName
的变化,以便在需要时更新 uppercaseFirstLetter
。有很多解决方案如何解决这个问题。关键词:“NSManagedObject”“KVO”
最后一个解决方案可能是更优雅的方式。
【讨论】:
以上是关于Core Data 中计算的持久属性的主要内容,如果未能解决你的问题,请参考以下文章