2012-05-07 26 views
10

Tengo una entidad en mi modelo de datos básicos como esto:Eliminar un objeto de datos básicos

@interface Selection : NSManagedObject 

@property (nonatomic, retain) NSString * book_id; 
@property (nonatomic, retain) NSString * contenu; 
@property (nonatomic, retain) NSNumber * page_id; 
@property (nonatomic, retain) NSNumber * nbrOfOccurences; 
@property (nonatomic, retain) NSString * next; 
@property (nonatomic, retain) NSString * previous; 

He creado muchos Selection s y las guardó en datos básicos y ahora me gustaría eliminar algunas selecciones con algunos criterios Por ejemplo, me gustaría eliminar un objeto Selection si coincide con el siguiente:

content = test 
page_id = 5 
book_id = 1331313 

cómo puedo hacer esto?

Respuesta

34

Lo que Mike Weller escribió es correcto. Expandiré la respuesta un poco.

primer lugar usted necesita para crear un NSFetchRequest como la siguiente:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];  
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Selection" inManagedObjectContext:context]]; 

Entonces usted tiene que fijar el predicado para esa solicitud como la siguiente:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"content == %@ AND page_id == %@ AND book_id == %@", contentVal, pageVal, bookVal]]; 

donde

NSString* contentVal = @"test"; 
NSNumber* pageVal = [NSNumber numberWithInt:5]; 
NSString* bookVal = @"1331313"; 

Estoy usando %@ ya que supongo que estás usando o proyectos y no valores escalares.

Ahora se realiza una pelota en el contexto de la solicitud anterior:

NSError* error = nil; 
NSArray* results = [context executeFetchRequest:fetchRequest error:&error]; 

results contiene todos los objetos gestionados que responden a ese predicado.

Finalmente, puede tomar los objetos y llamar a una eliminación en ellos.

[context deleteObject:currentObj]; 

Una vez hecho esto, debe guardar el contexto de acuerdo con la documentación.

Al igual que un objeto nuevo no se guarda en la tienda hasta que se guarda el contexto, un objeto eliminado no se elimina de la tienda hasta que se guarde el contexto.

Por lo tanto

NSError* error = nil; 
[context save:&error]; 

Tenga en cuenta que save método devuelve un valor booleano. Entonces puede usar un enfoque como el siguiente o mostrar una alerta al usuario. Fuente NSManagedObjectContext save error.

NSError *error = nil; 
if ([context save:&error] == NO) { 
    NSAssert(NO, @"Save should not fail\n%@", [error localizedDescription]); 
    abort(); 
} 
+1

Gracias por su respuesta – samir

+1

@flexaddicted Esto debe ser editado para incluir la llamada '[context save: & error]' que debe tener lugar, o el objeto eliminado no se elimina de la tienda . Además, si está utilizando una tienda persistente, tiene que guardarse de esta manera: '[context saveToPersistentStore: & error]'. –

+0

@EvanR Modifiqué mi respuesta teniendo en cuenta su comentario. –

5

Debe realizar una solicitud de recuperación usando un NSPredicate con las condiciones apropiadas, y luego llamar al método deleteObject: en NSManagedObjectContext con cada objeto en el conjunto de resultados.

+0

gracias por su respuesta – samir

4

Además de Mike Weller y flexaddicted, después de llamar [context deleteObject:currentObj]; que necesita para save: contexto:

NSError *error = nil; 
[context save:&error]; 

A partir documentation:

Así como un nuevo objeto no se guarda la tienda hasta que se guarde el contexto, un objeto eliminado no se elimina de la tienda hasta que se guarde el contexto.

Eso hizo que la cuestión en mi caso.

+0

Esto es definitivamente necesario: lo sugerí como una edición de la respuesta aceptada. –

Cuestiones relacionadas