Я работаю над примером кода из NSScreenCast, который занимается импортом в приложение Core Data. (Https://github.com/subdigital/nsscreencast/tree/master/012-core-data-importing-data/BeerBrowser). У меня есть пример, который работает по большей части. Я могу нажать кнопку обновления, он анализирует json и импортирует его в базу данных. Однако каждый раз, когда я нажимаю кнопку обновления, он повторно добавляет одни и те же данные. Я проследил его до следующего кода.Проблема с основными данными - проверка наличия элемента
+ (Brewery *)breweryWithServerId:(NSInteger)serverId usingManagedObjectContext:(NSManagedObjectContext *)moc {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[Brewery entityName]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"serverId = %d", serverId]];
[fetchRequest setFetchLimit:1];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:fetchRequest error:&error];
NSLog(@"results: %@", results);
if (error) {
NSLog(@"ERROR: %@ %@", [error localizedDescription], [error userInfo]);
exit(1);
}
if ([results count] == 0) {
return nil;
}
NSLog(@"results objectAtIndex:0 = %@", [results objectAtIndex:0]);
return [results objectAtIndex:0];
}
Что происходит, этот метод состоит в том, что он пытается выяснить, существует ли элемент в базе данных. Если этот вызов возвращает nil, тогда код в MasterViewController снова добавляет его в базу данных. Я проделал некоторую отладку, и serverId передается. Кроме того, fetchrequest кажется действительным (не удалось отладить его, чтобы быть уверенным). Как вы можете видеть, я поставил NSLog для результатов, но он возвращает пустой результат. Итак, тогда это происходит, если количество результатов равно 0, которое оно есть, оно возвращает nil. Таким образом, моя проблема. Я не вижу, где еще, где эта проблема может быть проблемой. Есть предположения?
Майк Райли
спасибо за помощь. Я попробовал это и по-прежнему получаю ту же проблему. После копания в нем немного больше кажется, что serverId, который он сравнивает, не сохраняется в базе данных в любой момент. Таким образом, setPredicate сравнивает serverId, который передается в столбец без данных. Таким образом, он никогда ничего не соответствует. Теперь я просматриваю код, чтобы узнать, могу ли я его найти. В datamodel отображается serverId. –
@MikeRiley, каковы журналы для результатов NSLog (@ ":% @", results); ' & 'NSLog (@ "results objectAtIndex: 0 =% @", [results objectAtIndex: 0]);'? – Kjuly