2010-08-10 37 views
6

Tôi muốn có được một đối tượng duy nhất từ ​​kho dữ liệu Core Data của tôi, đây là đoạn code tôi đã được sử dụng nhưng nó sẽ trả về một mảng các đối tượng, thì phải có một cách đơn giản hơn và tốt hơn:lấy đối tượng duy nhất từ ​​NSFetchRequest

NSFetchRequest *request= [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

NSError *error; 
NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
+0

[yêu cầu setFetchLimit: 1] có thể giới hạn số đối tượng được trả về, mặc dù bạn vẫn sẽ nhận được NSArray. – magma

Trả lời

8

Nếu vị ngữ của bạn luôn luôn lấy về nhiều hơn một kết quả:

  • tinh chỉnh vị - đừng quên bạn có thể xây dựng các vị từ với logic như AND/OR, bình đẳng đơn giản là dễ dàng, nhưng có thể không đủ trong chọn lọc trường hợp của bạn.

  • chỉ cần chọn kết quả mà bạn muốn từ mảng, đó là không có vấn đề lớn - mặc dù nếu điều này là có thể nó cũng phải có khả năng tinh chỉnh vị ...

  • xem xét tổ chức lại mô hình dữ liệu của bạn để bạn có có thể tinh chỉnh vị từ để chỉ lấy lại một mục.

Tìm nạp luôn trả về một mảng, đó là định nghĩa của nó. Tuy nhiên nó có thể là một mảng của một đối tượng.

+0

cũng sau đó những gì tôi đã hoạt động hoàn hảo :) Cảm ơn bạn đã làm rõ, ManufacturerID của tôi sẽ luôn luôn là duy nhất vì vậy tôi nên được tất cả các thiết lập. – Slee

6

Nó sẽ luôn trả về một mảng nhưng bạn có thể làm cho nó sạch hơn:

NSFetchRequest *request= [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

NSError *error; 
//Making a mutable copy here makes no sense. There is never a reason to make this mutable 
//NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
id manufacturer = [[managedObjectContext executeFetchRequest:request error:&error] lastObject]; 
request = nil; 
NSAssert1(error && !manufacturer, @"Error fetching object: %@\n%@", [error localizedDescription], [error userInfo]); 

-lastObject sẽ trở lại với mục cuối cùng trong mảng hoặc nil nếu mảng trống. Điều này giúp mã của bạn sạch hơn một chút khi bạn biết sẽ có một đối tượng trong mảng hoặc nếu bạn không quan tâm đối tượng nào bạn lấy ra khỏi mảng.

BTW, tên thuộc tính của bạn phải bắt đầu bằng chữ thường. Tôi ngạc nhiên khi trình biên dịch không cảnh báo bạn về điều đó.

+0

vì vậy thay vì mutableCopy khi tôi muốn tất cả các phần tử trong mảng nên sử dụng thay vào đó? Ngoài ra tôi chỉ sử dụng thủ đô trên tên thuộc tính của các thực thể trong mô hình dữ liệu cốt lõi của tôi, nếu không tôi sử dụng chữ thường. – Slee

+0

Trong mã của bạn trong câu hỏi bạn có 'ManufacturerID' do đó nhận xét của tôi về phần đó :) Đối với bản sao khác của bạn,' -executeFetchRequest: error: 'trả về một mảng. Bạn không cần phải làm bất cứ điều gì khác với nó. Việc gọi '-mutableCopy' chỉ biến nó thành một' NSMutableArray' mà không làm bất cứ điều gì hữu ích khi bạn đang làm việc với một 'NSArray' được trả về từ Core Data. Thêm vào mảng đó sẽ không thêm đối tượng vào Dữ liệu chính; việc loại bỏ các đối tượng khỏi mảng đó sẽ không xóa chúng khỏi Dữ liệu chính. –

0

Hãy thử fetchRequest.fetchLimit = 1. Bạn vẫn nhận được một mảng, nhưng với tối đa là 1 đối tượng.

+0

Tôi đã thử 'fetchLimit == 1' cho các đối tượng' dữ liệu cốt lõi'. Nó chỉ đơn giản là không làm việc –

+0

Nó hoạt động hoàn hảo. – user1447414

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