Я работаю над приложением для iPhone, которое получает несколько объектов из базы данных. Я хотел бы сохранить их с помощью Core Data, но у меня проблемы с отношениями.
Деталь содержит любое количество POI (точек интереса). Когда я получаю набор POI с сервера, они содержат подробный идентификатор. Чтобы связать POI с подробной информацией (по идентификатору), мой процесс выглядит следующим образом:
Запросите ManagedObjectContext для detailID.
Если эта деталь существует, добавьте к ней ПОИ.
Если этого не произойдет, создайте деталь (у нее есть другие свойства, которые будут заполнены лениво).
Проблема в этом - производительность. Выполнение постоянных запросов к базовым данным происходит медленно, до такой степени, что добавление списка из 150 POI занимает минуту благодаря множеству взаимосвязей.
В моей старой модели до Core Data (различные объекты кэша NSDictionary) этот процесс был очень быстрым (найдите ключ в словаре, а затем создайте его, если он не существует)
У меня больше отношений, чем только у этого, но почти каждый должен делать эту проверку (у некоторых много ко многим, и у них есть реальная проблема).
У кого-нибудь есть предложения, как я могу в этом помочь? Я мог бы выполнять меньше запросов (путем поиска нескольких разных идентификаторов), но я не уверен, насколько это поможет.
Код:
POI *poi = [NSEntityDescription
insertNewObjectForEntityForName:@"POI"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
poi.POIid = [attributeDict objectForKey:kAttributeID];
poi.detailId = [attributeDict objectForKey:kAttributeDetailID];
Detail *detail = [self findDetailForID:poi.POIid];
if(detail == nil)
{
detail = [NSEntityDescription
insertNewObjectForEntityForName:@"Detail"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
detail.title = poi.POIid;
detail.subtitle = @"";
detail.detailType = [attributeDict objectForKey:kAttributeType];
}
-(Detail*)findDetailForID:(NSString*)detailID {
NSManagedObjectContext *moc = [[UIApplication sharedApplication].delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"Detail" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"detailid == %@", detailID];
[request setPredicate:predicate];
NSLog(@"%@", [predicate description]);
NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil || [array count] != 1)
{
// Deal with error...
return nil;
}
return [array objectAtIndex:0];
}