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

时间:2014-10-02 01:07:01

标签: ios cocoa-touch core-data nsmanagedobject nsfetchedresultscontroller

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

操作将以这种方式完成:

  1. 使用英语数据库检索国家/地区名称
  2. 执行NSLocalizedString(countryNameInEnglish,nil)以获取本地化的国家/地区名称。
  3. 2将由此"虚拟"完成。属性。

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

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

    感谢

1 个答案:

答案 0 :(得分:8)

根据Apple的Non-Standard Persistent Attributes指南:

  

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

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

How to set "transient" flag

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

- (NSString *)localizedCountryName
{
    NSString *result;

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

    return result;
}