2012-10-05 49 views
6

Thiết lập: Tôi có một bộ sưu tập các đối tượng cha mẹ, gọi chúng là ObjectA. Mỗi ObjectA có mối quan hệ một-nhiều với ObjectB. Vì vậy, một ObjectA có thể chứa 0..n ObjectB-s, và mỗi ObjectB có một ObjectA cụ thể làm cha mẹ của nó.Cách sắp xếp kết quả Dữ liệu lõi dựa trên thuộc tính của bộ sưu tập đối tượng liên quan?

Bây giờ, tôi muốn thực hiện tìm nạp dữ liệu lõi của ObjectA-s, nơi chúng được sắp xếp theo ObjectB mới nhất của chúng. Có thể tạo ra một bộ mô tả sắp xếp cho điều đó không?

a related question mô tả chính xác cùng một tình huống. Câu trả lời cho thấy không chuẩn hóa thuộc tính từ ObjectB thành ObjectA. Điều này sẽ ổn nếu thực sự không có cách nào để làm điều này với một yêu cầu tìm nạp.

Câu hỏi có liên quan cũng đề cập đến:

Actually, I just had an idea! Maybe I can sort Conversations by [email protected]

tôi đã cố gắng. Nó dường như không thể. Tôi nhận được lỗi này:

2012-10-05 17:51:42.813 xxx[6398:c07] *** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', reason: 'Keypath containing 
KVC aggregate where there shouldn't be one; failed to handle 
[email protected]' 

Làm biến đổi thuộc tính thành ObjectA giải pháp duy nhất/tốt nhất?

Trả lời

0

Bạn có thể thêm một thuộc tính trong ObjectB đó là tem thời gian từ ngày add, sau đó trong lấy yêu cầu bạn có thể làm một cái gì đó như thế này:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"objectB.addTime" ascending:YES]; 
... 
fetchRequest.sortDescriptors = @[descriptor]; 
+2

Điều này không hiệu quả đối với tôi: 'NSInvalidArgumentException', lý do: 'không cần nhiều khóa ở đây' –

0

Tôi biết câu hỏi này là một chút cũ nhưng những gì Tôi đã làm được tất cả các ObjectB, lặp lại kết quả và rút ra thuộc tính ObjectB và thêm nó vào một mảng mới.

NSFetchRequest *fetchRequest = [NSFetchRequest new]; 
[fetchRequest setEntity:self.entityDescForObjectB]; 

// sort 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; 
[fetchRequest setSortDescriptors:@[sortDescriptor]]; 

NSError *error = nil; 
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (fetchedObjects == nil) { 
    NSLog(@"Error fetching objects: %@", error.localizedDescription); 
    return; 
} 

// pull out all the ObjectA objects 
NSMutableArray *tmp = [@[] mutableCopy]; 
for (ObjectB *obj in fetchedObjects) { 
    if ([tmp containsObject:obj.objectA]) { 
     continue; 
    } 
    [tmp addObject:obj.objectA]; 
} 

Điều này hoạt động vì CoreData là biểu đồ đối tượng để bạn có thể làm việc ngược. Vòng lặp ở cuối về cơ bản kiểm tra xem mảng tmp đã có một cá thể ObjectA cụ thể chưa và nếu nó không thêm nó vào mảng.

Điều quan trọng là bạn sắp xếp các ObjectBs nếu không, bài tập này là vô nghĩa.

Các vấn đề liên quan