2009-09-17 2 views
10

Nel mio progetto iPhone, voglio scrivere una funzione che controlli se c'è un oggetto nel mio Data Base ManagedObjectContext con un dato valore per una determinata proprietà, ad esempio some_property.Recupera oggetto per proprietà in Core Data

Se c'è già un oggetto con some_property == 12, voglio che la funzione restituisca l'oggetto, altrimenti, voglio creare l'oggetto, o almeno restituire nil.

Come faccio?

risposta

19

Il seguente frammento mostra come recuperare gli oggetti corrispondenti a un predicato specifico. Se non ci sono oggetti di questo tipo, lo snippet mostra come creare un nuovo oggetto, salvarlo e restituirlo.

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, che è stato veloce! Fammi provare questo ... – winsmith

+0

Qual è il punto di 'aFetchedResultsController'? Sto sbagliando pensando di crearlo, ma poi non lo uso mai per fare qualcosa? – ArtOfWarfare

+0

Hai ragione, in questo particolare esempio NSFetchedResultsController non viene utilizzato, ma dovrebbe essere nel contesto di un'applicazione reale (semplifica molte altre cose e fornisce un bel meccanismo di memorizzazione nella cache). –

2

E 'meglio se non fai il recupero più se si desidera verificare la presenza di alcune proprietà sui dati locali. Basta fare una richiesta di recupero usando una matrice pre-popolata e quindi scorrere o filtrare i risultati.

Si tratta di un frammento di codice da manuale di programmazione Core Data "Implementazione Trova-o-Create efficiente":

// 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];