核心数据实体的瞬态和派生属性之间的差异

Spa*_*Dog 3 cocoa-touch core-data nsfetchedresultscontroller nsmanagedobject ios

核心数据实体的瞬态和派生属性之间有什么区别?我想创建一个"虚拟"属性,可以在获取操作中使用该属性从核心数据实体返回本地化的国家/地区名称.

操作将以这种方式完成:

  1. 用英语从数据库中检索国家名称
  2. 执行NSLocalizedString(countryNameInEnglish,nil)以获取本地化的国家/地区名称.

2将由这个"虚拟"属性完成.

我应该使用哪一个?瞬态或衍生的,我该怎么做?

我没有什么可以告诉你的,因为我不知道我应该使用什么.

谢谢

A.S*_*.S. 8

根据Apple的非标准持久属性指南:

通过使用可转换属性或使用transient属性表示受支持的持久属性支持的非标准属性,可以将非标准类型用于持久属性.这两种方法背后的原理是相同的:您向实体的消费者呈现您想要的类型的属性,并在"幕后"将其转换为Core Data可以管理的类型.这些方法之间的区别在于,对于可转换属性,您只需指定一个属性,并自动处理转换.相反,对于瞬态属性,您可以指定两个属性,并且必须编写代码才能执行转换.

我建议使用瞬态属性.想法是你创建了2个字符串属性:countryName(非瞬态)和localizedCountryName(transient):

如何设置

然后,在NSManagedObjectSubclass中,您只需为localizedCountryName实现一个getter:

- (NSString *)localizedCountryName
{
    NSString *result;

    if ([self.countryName length] > 0) {
        result = NSLocalizedString(self.countryName, nil);
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)