У меня есть список мест из приложения rails, который я пытаюсь импортировать в приложение iOS5. У каждого Места есть родитель, который сам является Местом.
Я пытаюсь импортировать эти данные JSON с Core Data, используя словарь
- (void)initWithDictionary:(NSDictionary *)dictionary {
self.placeId = [dictionary valueForKey:@"id"];
id parent = [dictionary objectForKey:@"parent"];
if (parent && parent != [NSNull null]) {
NSDictionary *parentDictionary = parent;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"placeId = %@", [parentDictionary objectForKey:@"id"]];
NSArray *matching = fetchedWithPredicate(@"Place", self.managedObjectContext, predicate, nil);
if ([matching count] > 0) {
self.parent = [matching objectAtIndex:0];
} else {
self.parent = [NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:self.managedObjectContext];
[self.parent initWithDictionary:parentDictionary];
}
}
}
fetchedWithPredicate - метод, определенный как таковой
NSArray* fetchedWithPredicate(NSString *entityName, NSManagedObjectContext *context, NSPredicate *predicate, NSError **error) {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setIncludesPendingChanges:YES];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[request setEntity:entity];
[request setPredicate:predicate];
NSArray *result = [context executeFetchRequest:request error:error];
return result;
}
У меня также есть метод проверки в Place.m, чтобы убедиться, что я не создаю место с тем же placeId (placeId - это идентификатор на стороне сервера).
- (BOOL)validatePlaceId:(id *)value error:(NSError **)error {
if (*value == nil)
return YES;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"placeId = %@ AND (NOT self IN %@)", *value, [NSArray arrayWithObject:self]];
NSArray *matching = fetchedWithPredicate(@"Place", self.managedObjectContext, predicate, error);
if ([matching count] > 0) {
return NO;
}
else {
return YES;
}
}
Чтобы импортировать данные, я извлекаю все места с сервера, возвращенные в формате JSON.
Каждое место имеет свою собственную информацию, а также дочерний узел с информацией о родителе, что означает, что каждый родительский объект с несколькими дочерними элементами появится несколько раз. Похоже
{ "id": 73,
"name": "Some place",
"parent": { "id": 2,
"name": "Parent's name"}
}
Я подумал, что приведенный выше код, который выполняет своего рода «поиск или создание» с извлечением, включающим несохраненные изменения, будет в порядке.
Но он все еще пытается создать несколько записей для некоторых мест (и не удается, так как на месте есть проверка). Если посмотреть глубже, он действительно вставляет разные объекты основных данных для одного и того же placeId (разные указатели), но я не знаю почему.
Спасибо