Tôi gặp sự cố khi tìm nạp đối tượng sau khi được thêm vào trong mối quan hệ. Lần đầu tiên tôi lấy danh mục, luôn tìm thấy, sau đó khi tôi thêm vào mối quan hệ các loại sau không tìm thấy.Không tìm thấy một đối tượng trong coredata sau khi thêm vào mối quan hệ
Mối quan hệ là Many-To-Many
.
Ví dụ:
- Fetch loại với
categoryId = 10
- Tìm thấy loại đối tượng
- Thêm vào các mối quan hệ đối tượng cha
- đối tượng Tiếp
Nếu một số chuyên mục có cùng
id
,categoryId = 10
, không được tìm thấyNSManagedObjectContext *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:
Giải Quyết, tôi đoán vấn đề của tôi là tôi quên để lưu các bối cảnh chính vào cuối mỗi lần lặp.
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];
}
}];
}
}
}];
Đối tượng 'deal' thuộc về ngữ cảnh nào? Có vẻ như nó phải là một ngữ cảnh khác với 'riêng tư '. Bạn không nên đặt mối quan hệ giữa các đối tượng trong các ngữ cảnh khác nhau. Vượt qua managedObjectID và sau đó lấy nó trong ngữ cảnh 'private' bằng cách sử dụng' objectWithID'. – pbasdf
Tôi đã kiểm tra rồi, nhưng 'thỏa thuận' được tạo bên trong ngữ cảnh riêng – brunobasas
vì vậy vấn đề của bạn chỉ với caregoryId = 10? Lần đầu tiên bạn có 10 trong dic [@ "mainAttribute"] nó tìm thấy thể loại và lần thứ 2 nó không? Thực tế là vấn đề có thể không đến từ MR_findFirstByAttribute cho tôi biết rằng vấn đề có thể là chuỗi chứa số nguyên trong dic [@ "mainAttribute"]. bạn có thể NSLog (@ "ID: -% @ -") để kiểm tra xem ID không có dấu cách trước hay sau? – Mikael