2009-09-17 20 views
10

iPhone projemde, Core Data ManagedObjectContext öğesinde belirli bir özellik için verilen bir değerle (some_property) bir nesne olup olmadığını kontrol eden bir işlev yazmak istiyorum.Çekirdek Verisi'nde nesneye göre nesne getirme

Zaten some_property == 12 numaralı bir nesne varsa, nesnenin döndürülmesi işlevini istiyorum, aksi halde, nesneyi oluşturmak veya en azından nil'u döndürmek istiyorum.

Bunu nasıl yaparım?

cevap

19

Aşağıdaki kod parçacığı, belirli bir yüklemeyle eşleşen nesneleri nasıl alacağınızı gösterir. Böyle bir nesne yoksa, parçacık yeni bir nesne oluşturmayı, kaydetmeyi ve geri döndürmeyi gösterir.

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

vay, bu hızlı oldu! Bunu deneyelim ... – winsmith

+0

"aFetchedResultsController" nin anlamı nedir? Onu yarattığını düşünerek yanılıyor muyum, ama bir şey yapmak için asla kullanmıyor musunuz? – ArtOfWarfare

+0

Haklısınız, bu örnekte NSFetchedResultsController kullanılmıyor, ancak gerçek bir uygulama bağlamında olmalı (başka birçok şeyi basitleştirir ve güzel bir önbellek mekanizması sağlar). –

2

Yerel verilerde belirli özellikleri kontrol etmek istiyorsanız birden çok alma işlemi yapmazsanız daha iyi olur. Önceden doldurulmuş bir diziyi kullanarak tek bir istek isteğinde bulunun ve ardından sonuçları yineleyin veya filtreleyin.

Bu Çekirdek Veri Program Rehberi bir kod parçacığı "Uygulama bul-ya-Create Verimli" dır:

// 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]; 
İlgili konular