У меня есть два подкласса NSManagedObject
, Book
и Category
. Эти два связаны отношениями «один ко многим».Запрос NSFetchRequest возвращает nil после установки отношения один к другому
Book
сторона, имеет отношение categories
подключен к Category
. Непосредственно Category
подключен к Book
через books
.
Моя установка приложения - это загрузка данных с моего сервера при каждом открытии приложения. Загруженные данные будут перемещены и сохранены в приложении. В моем приложении я использую Magical Record для взаимодействия с CoreData.
Category
данные сначала загрузить, а затем сохранены в формате JSON:
{
"categories" : [
{
"id" : 1,
"name" : "Fiction"
},
{
"id" : 2,
"name" : "Non-fiction"
}
]
}
Там не было никаких проблем по экономии Category
. Хотя позже на жизненном цикле приложения Book
данные будут сохранены в формате JSON следующим образом:
{
"books" : [
{
"id" : 1,
"name" : "Fiction 1",
"category_id" : 1
},
{
"id" : 2,
"name" : "Fiction 2",
"category_id" : 2
}
]
}
Проблема возникает, когда я хочу назначить Book
отношение к Category
. Мой код, чтобы назначить связь:
for (NSDictionary *bookInfo in jsonObject[@"books"]) {
Book *book = [Book createEntity];
book.identifier = bookInfo[@"id"];
book.name = bookInfo[@"name"];
Category *category = [Category findFirstByAttribute:@"identifier" withValue:bookInfo[@"category_id"]];
book.category = category;
[[NSManagedObjectContext contextForCurrentThread] saveNestedContexts];
}
В первом цикле объект bookObject был успешно сохранен. Но во втором цикле и следующем, Category
больше не может быть запрошен. Он возвращает нуль, несмотря на то, что identifier
.
Я выполнил проверку на всех Category
через [Category findAll]
и прошел все записи и обнаружил, что Category
с тем же идентификатором все еще существуют во втором и следующем циклах.
Вопрос в том, почему findFirstByAttribute:withValue:
не удалось получить Category
во втором цикле?
Я только что обнаружил, что 'saveUsingCurrentThreadContextWithBlockAndWait' работал на более старых устройствах iOS 5, где' saveWithBlockAndWait' сбой каждый раз. Спасибо за совет, @Willy. –