2009-09-17 21 views
10

Trong dự án iPhone của tôi, tôi muốn viết một hàm kiểm tra có một đối tượng trong dữ liệu lõi của tôi ManagedObjectContext với một giá trị nhất định cho một thuộc tính nhất định, nói some_property.Tìm nạp đối tượng theo thuộc tính trong Dữ liệu chính

Nếu đã có đối tượng với some_property == 12, tôi muốn hàm trả về đối tượng, nếu không, tôi muốn tạo đối tượng hoặc ít nhất trả về nil.

Tôi làm như thế nào?

Trả lời

19

Đoạn mã sau đây cho biết cách truy xuất đối tượng khớp với vị từ cụ thể. Nếu không có các đối tượng như vậy, đoạn mã sẽ hiển thị cách tạo một đối tượng mới, lưu nó và trả về nó.

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourEntityName" inManagedObjectContext:managedObjectContext]; 
    [request setEntity:entity]; 
    // retrive the objects with a given value for a certain property 
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"property == %@", value]; 
    [request setPredicate:predicate]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"yourSortKey" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors]; 



    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
    aFetchedResultsController.delegate = self; 

    NSError *error = nil; 
    NSArray *result = [managedObjectContext executeFetchRequest:request error:&error]; 

    [request release]; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 


    if ((result != nil) && ([result count]) && (error == nil)){ 
     return [NSMutableArray arrayWithArray:result]; 
    } 
    else{ 
     YourEntityName *object = (YourEntityName *) [NSEntityDescription insertNewObjectForEntityForName:@"YourEntityName" inManagedObjectContext:self.managedObjectContext]; 
      // setup your object attributes, for instance set its name 
      object.name = @"name" 

      // save object 
      NSError *error; 
      if (![[self managedObjectContext] save:&error]) { 
      // Handle error 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

      } 

      return object; 

    } 
+0

wow, đó là nhanh chóng! Hãy để tôi thử điều đó ... – winsmith

+0

Điểm của 'aFetchedResultsController' là gì? Tôi nhầm khi nghĩ rằng bạn tạo ra nó, nhưng sau đó không bao giờ sử dụng nó để làm bất cứ điều gì? – ArtOfWarfare

+0

Bạn nói đúng, trong ví dụ cụ thể này NSFetchedResultsController không được sử dụng, nhưng nó phải ở trong bối cảnh của một ứng dụng thực (nó đơn giản hóa nhiều thứ khác, và cung cấp một cơ chế bộ nhớ đệm tốt đẹp). –

2

Sẽ tốt hơn nếu bạn không thực hiện tìm nạp nhiều lần nếu bạn muốn kiểm tra các thuộc tính nhất định trên dữ liệu cục bộ. Chỉ cần thực hiện một yêu cầu tìm nạp bằng cách sử dụng một mảng được điền trước và sau đó lặp lại hoặc lọc kết quả.

Đây là một đoạn mã từ Programming Guide Core Data "Thực thi Tìm-hoặc-Tạo hiệu quả":

// get the names to parse in sorted order 
NSArray *employeeIDs = [[listOfIDsAsString componentsSeparatedByString:@"\n"] 
     sortedArrayUsingSelector: @selector(compare:)]; 

// create the fetch request to get all Employees matching the IDs 
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity: 
     [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:aMOC]]; 
[fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"(employeeID IN %@)", employeeIDs]]; 

// make sure the results are sorted as well 
[fetchRequest setSortDescriptors: [NSArray arrayWithObject: 
     [[[NSSortDescriptor alloc] initWithKey: @"employeeID" 
       ascending:YES] autorelease]]]; 
// Execute the fetch 
NSError *error; 
NSArray *employeesMatchingNames = [aMOC 
     executeFetchRequest:fetchRequest error:&error]; 
Các vấn đề liên quan