2014-12-16 2 views
0

В нашей системе 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 ... он никогда не меняется.

Я даже попытался удалить приложение и перезапустить/очистить симулятор всех данных.


Оказалось, что в данных ядра отсутствуют правильные отношения. Спасибо всем, кто помог.

+0

Что такое отношения между 'User' и' 'AccountCredit? Имеет ли он обратную связь? Кроме того, вы уверены, что внутри метода 'accountCreditFromResource' вы создаете десять разных объектов' AccountCredit', а не один и тот же объект десять раз? –

+0

Я смотрю на Core Data xcdatamodel и появляется его один к одному. Я не уверен, как я это пропустил. Теперь я увижу, разрешает ли это проблема. –

+0

Похоже, что мне действительно не хватало отношений от одного до многих; в настоящее время я исправил проблему - но я испытываю некоторые основные ошибки данных. Я верю, что смогу это решить. Я очищаю приложение и каждый раз перезагружаю приложение, чтобы предотвратить проблемы. Надеюсь, это просто вопрос о взаимоотношениях. –

ответ

-2

Попробуйте

//set properety for array with data 

@property (strong) NSMutableArray *data; 


NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Entity"]; 
    self.data = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 

Не забудьте поставить этот метод в контроллере представления:

- (NSManagedObjectContext *)managedObjectContext 
{ 
    NSManagedObjectContext *context = nil; 
    id delegate = [[UIApplication sharedApplication] delegate]; 
    if ([delegate performSelector:@selector(managedObjectContext)]) { 
     context = [delegate managedObjectContext]; 
    } 
    return context; 
} 
+1

Это не отвечает на вопрос. В вашем ответе описывается, как настроить стек Core Data, но OP уже настроил его. –

+0

Похоже, что я не установил правильное отношение; это должно было быть отношением «один ко многим» в данных Core, и по какой-то причине он просто не был настроен. –