2012-04-22 9 views
7

Soy muy nuevo en la programación de datos básicos. Tengo una pregunta a la que espero obtener alguna aclaración.Cómo comprobar si una entidad ya existe en la tienda persistente

Suponiendo que tengo una NSManagedObject llamados Company, con los siguientes atributos:

  • companyName
  • companyEmail
  • companyPhoneNo
  • companyUserName
  • companyPassword

En este objeto el atributo companyName está indexado.

Entonces, mi pregunta es, ¿cómo puedo asegurarme de que solo habrá una entrada con la misma compañíaName, companyEmail, companyPhoneNo, companyUserName y companyPassword?

¿Necesito hacer una solicitud para verificar si hay algún registro con los mismos valores de atributo o si es suficiente una simple comprobación con el ID del objeto?

Gracias.

Respuesta

13

He aquí un ejemplo puede ser ayuda:

NSError * error; 
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:NSStringFromClass([self class]) 
            inManagedObjectContext:managedObjectContext]]; 
[fetchRequest setFetchLimit:1]; 

// check whether the entity exists or not 
// set predicate as you want, here just use |companyName| as an example 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"companyName == %@", companyName]]; 

// if get a entity, that means exists, so fetch it. 
if ([managedObjectContext countForFetchRequest:fetchRequest error:&error]) 
    entity = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] lastObject]; 
// if not exists, just insert a new entity 
else entity = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([self class]) 
              inManagedObjectContext:managedObjectContext]; 
[fetchRequest release]; 

// No matter it is new or not, just update data for |entity| 
entity.companyName = companyName; 
// ... 

// save 
if (! [managedObjectContext save:&error]) 
    NSLog(@"Couldn't save data to %@", NSStringFromClass([self class])); 

Consejo: countForFetchRequest:error: no recupera entidad realidad, sólo se devuelve un número de entidades que coinciden con el predicate se establece antes.

1

usted tiene dos opciones para mantener a almacenar sin duplicados:

  1. make fetch de inserción.
  2. Inserte todos los datos nuevos y luego elimine los duplicados antes de guardarlos.

¿Qué es más rápido y más conveniente? Presumiblemente de primera manera. Pero será mejor que lo pruebes usando instrumentos y encuentres el camino correcto para tu aplicación.

Aquí están los documentos sobre esta cuestión. http://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html#//apple_ref/doc/uid/TP40003174-SW1

Cuestiones relacionadas