В нашей системе user
имеет много accountCredits
Основные данные. Выполнение запроса на выборку извлекает только 1 запись; когда 10 вставлены?
Эти accountCredits
приходят от сервера.
У меня есть запрос, который извлекает и вставляет 10 записей в mainContext
объекта Core Data из accountCredits
и может видеть, что эти 10 записей в моем журнале консоли Xcode. Они, похоже, успешно вставлены. Я вижу их в журнале консоли Xcode.
Однако сразу после этого я выполняю очень простой запрос на выборку для извлечения пользователя и их соответствующих accountCredits
- он должен видеть 10; но это только когда-либо видел 1, и я не знаю, почему.
Первое, что я сделал, это проверить context
на каждом шагу (до, во время, после) и context
id не изменяется. Так что это не проблема контекста.
Но я не знаю, почему его единственное видение 1 записи, когда я знаю и записал, что 10 записей вставляются.
Я попытался отформатировать, чтобы сделать его понятным и вставить код ниже;
NSArray *accountCredits = [resource linkedResourceForKey:@"accountCredits"];
if (accountCredits) {
for (JSONAPIResource *accountCreditResource in accountCredits) {
VICAccountCredits *accountCredits = [VICAccountCredits accountCreditFromResource:accountCreditResource inContext:context];
if (accountCredits) {
[accountCredits setUser:user];
NSLog(@"userAPI.accountCredit - %@ %lu %@", accountCredits.code, (long)[accountCredits.amountGBP integerValue], accountCredits.user.name);
}
}
}
NSLog(@"------");
NSLog(@"... After loading ...");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
NSLog(@"AccountCredits -- %@", [info valueForKey:@"accountCredits"]);
VICAccountCredits *cr = [info valueForKey:@"accountCredits"];
NSLog(@"cr - %@ %@", cr.code, cr.user.name);
}
accountCreditForResource
создает accountCredit
как это (измененная);
+ (VICAccountCredits *)accountCreditFromResource:(JSONAPIResource *)resource inContext:(NSManagedObjectContext *)context
{
NSString *id = [resource safeObjectForKey:@"id"];
VICAccountCredits *accountCredit = [VICAccountCredits objectWithRemoteID:id inContext:context];
if(!accountCredit) {
accountCredit = [self insertInManagedObjectContext:context];
accountCredit.remoteID = id;
}
accountCredit.amountGBP = [[resource safeObjectForKey:@"amountGBP"] safeObjectForKey:@"amount"];
accountCredit.code = [[resource safeObjectForKey:@"links"] safeObjectForKey:@"code"];
return accountCredit;
}
Я использовал точки останова внутри if (!accountCredit)
и увидеть, что на самом деле это ввести заявление, если-и не вставить его в правильное или mainContext
.
отчеты Log/консоль:
Contexts = <NSManagedObjectContext: 0x7fa86b624270>
userAPI.accountCredit - G0CR7 1000 a d
userAPI.accountCredit - A1GH5 1000 a d
userAPI.accountCredit - A2EF7 1000 a d
userAPI.accountCredit - A4JX4 1000 a d
userAPI.accountCredit - A6NA9 1000 a d
userAPI.accountCredit - A9DI2 1000 a d
userAPI.accountCredit - D1RK0 1000 a d
userAPI.accountCredit - D2LG1 1000 a d
userAPI.accountCredit - E0UH0 1000 a d
userAPI.accountCredit - E3TU4 1000 a d
------
.. After loading ...
AccountCredits -- <VICAccountCredits: 0x7fa86b63e870> (entity: AccountCredit; id: 0xd000000000100002 <x-coredata://A4310709-6655-4333-8FE3-2C92821DA793/AccountCredit/p4> ; data: {
amountGBP = 1000;
code = E3TU4;
remoteID = 548f137824848be367e1aac3;
user = "0xd000000000040000 <x-coredata://A4310709-6655-4333-8FE3-2C92821DA793/User/p1>";
})
-> 112 cr - E3TU4 a d
Я нахожу это трудно понять, почему при вставке 10 записей, он может видеть только 1?
Может кто-то пролить свет на это?
Я проверил context
... он никогда не меняется.
Я даже попытался удалить приложение и перезапустить/очистить симулятор всех данных.
Оказалось, что в данных ядра отсутствуют правильные отношения. Спасибо всем, кто помог.
Что такое отношения между 'User' и' 'AccountCredit? Имеет ли он обратную связь? Кроме того, вы уверены, что внутри метода 'accountCreditFromResource' вы создаете десять разных объектов' AccountCredit', а не один и тот же объект десять раз? –
Я смотрю на Core Data xcdatamodel и появляется его один к одному. Я не уверен, как я это пропустил. Теперь я увижу, разрешает ли это проблема. –
Похоже, что мне действительно не хватало отношений от одного до многих; в настоящее время я исправил проблему - но я испытываю некоторые основные ошибки данных. Я верю, что смогу это решить. Я очищаю приложение и каждый раз перезагружаю приложение, чтобы предотвратить проблемы. Надеюсь, это просто вопрос о взаимоотношениях. –