我的iPhone应用程序中需要多语言的coredata数据库。我可以为每种语言创建不同的数据库,但我希望iphone sdk中存在一种自动管理不同语言核心数据(如资源和字符串)中数据的方法。
有人有提示吗?
最佳答案
我做了一些类似于Shortseller的事情,但是没有使用类别。
InternationalBook
和LocalizedBook
都是具有一对多关系(一本国际图书到许多本地化图书)的自定义托管对象。
在InternationalBook
的实现中,我为title
添加了一个自定义访问器:
- (NSString *)title {
[self willAccessValueForKey:@"title"];
NSString *locTitle = nil;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"locale==%@", [DataManager localeString]];
NSSet *localizedSet = [self.localizedBook filteredSetUsingPredicate:predicate];
if ([localizedSet count] > 0) {
locTitle = [[localizedSet valueForKey:@"localizedTitle"] anyObject];
}
[self didAccessValueForKey:@"title"];
return locTitle;
}
[DataManager localeString]
是一个类方法,它返回用户的语言和国家/地区代码:en_US
,fr_FR
等。有关详细信息,请参阅NSLocale
上的文档。有关
willAccessValueForKey:
和didAccessValueForKey:
的说明,请参见《核心数据编程指南》中的“自定义属性和一对一关系访问器方法”部分。填充数据时,我抓取了一个表示用户当前语言环境的字符串(
[DataManager localeString]
),并将其与本地化的书名一起存储在新的LocalizedBook
对象中。每个LocalizedBook
实例都添加到一个NSMutableSet
中,它表示一对多关系。NSMutableSet *bookLocalizations = [internationalBook mutableSetValueForKey:@"localizedBook"]; // internationalBook is an instance of InternationalBook
// set the values for locale and localizedTitle
LocalizedBook *localizedBook = (LocalizedBook *)[NSEntityDescription insertnNewObjectEntityForName:@"LocalizedBook" inManagedObjectContext:self.bookMOC];
localizedBook.locale = [DataManager localeString];
localizedBook.localizedTitle = theLocalizedTitle; // assume theLocalizedTitle has been defined.
[bookLocalizations addObject:localizedBook];
[bookLocalizations setValue:localizedBook forKey:@"localizedBook"];
由于本地化的标题存储在
LocalizedBook
受管对象中,因此您可以将title
属性设为 transient ,但是如果这样做,则不能在谓词中使用title
。这种方法的好处是,对所有关系的实现对任何消费者都是透明的。您只需请求
internationalBook.title
,然后自定义访问器就会根据用户在幕后的语言环境返回适当的值。关于iphone - 核心数据中多语言数据的良好做法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2689570/