核心数据关系设计 - 仅加载所需的实体
Core Data Relationship Designing - Load only desired entity
我需要帮助使用 Core Data 为我的应用程序设计数据库。
即:
我有 2 个实体,分别叫做 Verse 和 Translation。
Verse 与翻译是一对多的关系 table。
翻译 table 包含不同语言的翻译,例如 EN、DE、AR。
我知道如果我加载 Verse table 那么相应的翻译也会延迟加载。
但我只想加载每节的所需翻译。例如只有 EN.
因为如果我加载 1000 节并使用 5 种不同的翻译(DE、EN、TR、AR、FR),那么我有大量数据需要避免 >> 1000x5 = 5000。
我不想每次都加载我不需要的翻译。仅选择的翻译。
感谢您的任何建议。
此致,
核心数据会做一些叫做错误的事情,它应该只加载你实际要求的数据。它可能会为所有这些对象加载一些元数据,但在您请求之前它不会真正加载翻译。如果您想了解更多信息,我建议您多研究故障,因为它看起来相当复杂。至少其余的故障看起来很复杂。
我找到了一个解决方案,这正是我想要的。我进行了测试,它 returns 只有所需的翻译。
- (NSArray *) loadAllVersesByLanguage
{
NSManagedObjectContext *_managedObjectContext = [self managedObjectContext];
NSArray *fetchedObjects;
NSString *turkish = @"TR";//should be parameterized
NSString *arabic = @"AR";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"languageCode==%@ OR languageCode==%@",turkish,arabic];
NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"Verse"];
NSError * error = nil;
fetchedObjects = [_managedObjectContext executeFetchRequest:fetch error:&error];
if(fetchedObjects != nil && fetchedObjects.count > 0 ){
for(Verse *verse in fetchedObjects){
NSSet *verseSet = [verse.translations filteredSetUsingPredicate:pred];
[verse.translations setSet:verseSet];
}
return fetchedObjects;
}else{
return nil;
}
return nil;
}
我需要帮助使用 Core Data 为我的应用程序设计数据库。
即:
我有 2 个实体,分别叫做 Verse 和 Translation。 Verse 与翻译是一对多的关系 table。 翻译 table 包含不同语言的翻译,例如 EN、DE、AR。
我知道如果我加载 Verse table 那么相应的翻译也会延迟加载。
但我只想加载每节的所需翻译。例如只有 EN.
因为如果我加载 1000 节并使用 5 种不同的翻译(DE、EN、TR、AR、FR),那么我有大量数据需要避免 >> 1000x5 = 5000。
我不想每次都加载我不需要的翻译。仅选择的翻译。
感谢您的任何建议。
此致,
核心数据会做一些叫做错误的事情,它应该只加载你实际要求的数据。它可能会为所有这些对象加载一些元数据,但在您请求之前它不会真正加载翻译。如果您想了解更多信息,我建议您多研究故障,因为它看起来相当复杂。至少其余的故障看起来很复杂。
我找到了一个解决方案,这正是我想要的。我进行了测试,它 returns 只有所需的翻译。
- (NSArray *) loadAllVersesByLanguage
{
NSManagedObjectContext *_managedObjectContext = [self managedObjectContext];
NSArray *fetchedObjects;
NSString *turkish = @"TR";//should be parameterized
NSString *arabic = @"AR";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"languageCode==%@ OR languageCode==%@",turkish,arabic];
NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"Verse"];
NSError * error = nil;
fetchedObjects = [_managedObjectContext executeFetchRequest:fetch error:&error];
if(fetchedObjects != nil && fetchedObjects.count > 0 ){
for(Verse *verse in fetchedObjects){
NSSet *verseSet = [verse.translations filteredSetUsingPredicate:pred];
[verse.translations setSet:verseSet];
}
return fetchedObjects;
}else{
return nil;
}
return nil;
}