2014-06-11 57 views
1

我在尝试本地化我的核心数据应用程序。我发现了不同的方法,我最感兴趣的方法是question。基本上它创建一个新表并覆盖吸气剂,以返回正确的本地化。核心数据覆盖吸气和预测

entity(Book, title, localizedTitle) 

entity(LocalizedString, localization, string) 

我现在没有得到的是,如果它也影响谓词。通常我会写这样的断言:

[NSPredicate predicateWithFormat:@"title = %@", someString]; 

万一产权通过一类是在我的CoreData类覆盖进行本地化,并someString是用户选择我要寻找的。这是否将本地化标题与someString或标题进行比较?

所以将谓语使用title的覆盖性能,并返回localizedTitle将它与someString比较,还是会使用空title领域比较它someString

回答

0

我不得不撤销了答案,因为我发现,当您重写getter时,NSPredicate将使用重写的getter。一些奇怪的行为,但似乎像codeData这样做。

+0

对于NSPredicate,它将**不使用NSManagedObject的子类中的getter。我尝试过这个。 – Binarian

+0

我昨天写了它,当使用重写的getter时,NSPredicate导致了一些奇怪的行为。必须用本地化标题创建一个新的getter。我使用了上面提到的问题的相同代码。只有区别,吸气剂属于一类。我能够在NSPredicate和NSFetchedResultsController中访问'category-getter'作为sectionNameKeyPath。所以行为可能会随着版本而改变?我正在使用XCode 5.1.1和iOS 7。 – Jan

0

NSPredicate本身并没有使用您的任何代码,如果没有插入您的%@。这是一个包装对象中的SQLite请求NSPredicate。对于标题,您不会在数据库中的行中使用您的封装CoraData对象的标题属性(如getter)。 title只是对数据库中列的访问,没有什么是瞬态的。

您创建的自定义getter用于通过CoreData从数据库接收数据,将每行打包到从NSManagedObject分类的包装对象中。如果您访问此包装对象的属性,它将读取数据并将其本地化。所以数据没有任何变化。


我用一个小应用程序测试过,以确保!

也许我们是指不同的东西。我有一个NSManaged对象的子类。该子类使用自定义getter将NSManagedObject的值从@“butter”更改为@“milch”。在SQLite数据库中的真实值(只能确保使用@dynamic),输出是'butter',但是使用自定义getter,我试过的每个其他类都会从CoreData中得到'milch'属性,除了NSPredicate。该属性被称为'名称'。现在我用一个NSPredicate

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"name = %@", @"milch"]; 

这是使用吸气。由于所有对象将履行与自定义的getter是谓:

- (NSString *)name { 
    return @"milch"; 
} 

也许另一个计算器的答案是更精确:

NSPredicate in NSFetchedResultsController doesn't use Category's getter

+0

我不太确定我了解你的答案。如果我编写一个类别,谓词不会使用它,因为CoreData会计算它自己的属性?那么我将如何重写我的谓词呢? – Jan

+0

@Dimitri如果您的意思是标题 – Binarian

+0

,请更新答案,这样我必须使用本地化标题编写谓词。 – Jan