Mam problem z pobieraniem obiektu po dodaniu go w relacji. Pierwszy raz, kiedy pobierałem kategorię, zawsze znajdowałem, a następnie dodałem do relacji następujące kategorie nie znaleziono.Nie znaleziono obiektu w coredatach po dodaniu do relacji
Związek to Many-To-Many
.
Przykład:
- Fetch kategoria z
categoryId = 10
- kategoria obiektu
- Dodano do relacji nadrzędny obiekt
- Następny obiekt
Jeżeli kilka kategorii ma taką samą
id
,categoryId = 10
, nie znalezionoNSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [private setParentContext:self.model.context]; __block NSError *error = nil; [private performBlockAndWait:^{ GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:private]; for (NSDictionary *dic in responseObject[@"response"]) { GPCategory *category; //The first time always found if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:private])) { NSLog(@"Found"); [category addDealsObject:deal]; } else { NSLog(@"Not Found"); } } }]; NSError *PrivateError = nil; if (![private save:&PrivateError]) { NSLog(@"Unresolved error %@, %@", PrivateError, [PrivateError userInfo]); abort(); } if (!error) { //Save on main moc [self.model saveWithErrorBlock:^(BOOL success, NSError *error) { if (!success) { NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); } }]; } else { NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); }
EDIT:
rozwiązany, myślę, że moim problemem było to, że zapomniałem zapisać główny kontekst, w końcu każdej iteracji.
NSManagedObjectContext *backgroundMOC = [self.model backgroundMOC:self.model.context];
[backgroundMOC performBlockAndWait:^{
for (NSDictionary *dic in responseObject[@"response"]) {
GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:backgroundMOC];
GPCategory *category;
if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:backgroundMOC])) {
NSLog(@"Found with mainAttribute %@", dic[@"mainAttribute"]);
[deal addDealCategoryObject:category];
}
if([backgroundMOC hasChanges]) {
NSError * error;
[backgroundMOC save:&error];
[self.model.context performBlockAndWait:^{
if([self.model.context hasChanges]) {
NSError * error;
[self.model.context save:&error];
}
}];
}
}
}];
Do jakiego kontekstu należy obiekt 'deal'? Wygląda na to, że musi to być inny kontekst niż "prywatny". Nie powinieneś ustawiać relacji między obiektami w różnych kontekstach. Przekaż obiekt managedObjectID, a następnie pobierz go w kontekście "private", używając parametru "objectWithID". – pbasdf
Sprawdziłem już, ale "deal" jest tworzony wewnątrz prywatnego kontekstu – brunobasas
, więc twój problem jest tylko z caregoryId = 10? 1. raz masz 10 w dic [@ "mainAttribute"] znajduje kategorię, a po raz drugi nie? Fakt, że problem może nie pochodzić z MR_findFirstByAttribute mówi mi, że problem może być ciągiem zawierającym liczbę całkowitą w dic [@ "mainAttribute"]. czy mógłbyś NSLog (@ "ID: -% @ -") w celu sprawdzenia, czy ID nie ma spacji przed lub po? – Mikael