Domanda Rimozione di una voce / riga specifica da Core-Data


Uso i dati principali nella mia app e sono confuso quando si tratta di rimuovere determinate righe o voci dall'archivio dati principale. Inserisco alcuni prodotti nell'archivio in questo modo:

NSManagedObject *Product = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:context];
[Product setValue:[NSNumber numberWithFloat:id] forKey:@"pid"];
[Product setValue:[NSNumber numberWithFloat:quantity] forKey:@"pquantity"];

Funziona bene per l'inserimento. Tuttavia, più avanti nell'app, voglio rimuovere la voce dove, ad esempio, il pid è 53. Come farei per rimuovere solo questa riga / voce? L'equivalente SQL sarebbe qualcosa di simile:

DELETE from Product WHERE pid = '53'

Apprezzerei molto il codice di esempio, dato che non riesco a capirlo.

Grazie per qualsiasi aiuto.


23
2018-06-29 17:35


origine


risposte:


Come ha detto @Nektarios, hai a che fare con oggetti qui, quindi vuoi trovare un oggetto con un particolare valore di attributo. Tu con una richiesta di recupero e un predicato.

  NSNumber *soughtPid=[NSNumber numberWithInt:53];
  NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"Product" inManagedObjectContext:context];
  NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
  [fetch setEntity:productEntity];
  NSPredicate *p=[NSPredicate predicateWithFormat:@"pid == %@", soughtPid];
  [fetch setPredicate:p];
  //... add sorts if you want them
  NSError *fetchError;
  NSArray *fetchedProducts=[self.moc executeFetchRequest:fetch error:&fetchError];
  // handle error

Il fetchedProducts la matrice conterrà tutti gli oggetti dell'entità Product di chi pid attributo è uguale a soughtPid. Si noti che il predicato soddisfa la stessa funzione logicamente del where clausola in SQL.

Una volta che hai gli oggetti, devi solo dire al contesto di cancellarli:

  for (NSManagedObject *product in fetchedProducts) {
    [context deleteObject:product];
  }

Al successivo salvataggio del contesto, i dati dell'oggetto verranno eliminati dal file di archivio permanente.


42
2018-06-29 20:15



Come "DELETE from tableName WHERE condition" di Sqlite, non hai un singolo passaggio da eliminare MULTIPLE oggetti da CoreData.

In CoreDataprima devi farlo andare a prendere oggetti che devono essere cancellati, usando NSFetchRequest e NSPredicate

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"EntityName"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"propertyName == %@", value];
[request setPredicate:predicate];

NSError *error = nil;
NSManagedObjectContext *managedObjectContext;//Get your ManagedObjectContext;
NSArray *result = [managedObjectContext executeFetchRequest:request error:&error];

Quindi, dovresti iterate attraverso tutti NSManagedObject e chiama deleteObject: dal tuo NSManagedObjectContext.

if (!error && result.count > 0) {
    for(NSManagedObject *managedObject in result){
        [managedObjectContext deleteObject:managedObject];
    }

    //Save context to write to store
    [managedObjectContext save:nil];
}

13
2018-05-20 07:36



Ricorda di pensare a Core Data come a un grafico e non a un DB, quindi il concetto di righe non si applica. Invece, si desidera rimuovere un oggetto specifico dal grafico.

Hai usato insertNewObjectForEntityForName:inManagedObjectContext: per inserirlo Uso deleteObject: per eliminarlo, ad esempio:

[aContext deleteObject:aManagedObject];

Nel tuo caso,

[context deleteObject:Product];

In bocca al lupo

Vedi Apple spiegazione qui

Nota: quando si elimina, a seconda del proprio schema, ciò può avere implicazioni diverse. Ad esempio, potrebbe cancellare tutto più in basso lungo il percorso figlio del grafico dell'oggetto Dati di base. Assicurati di pensare seriamente quando progetti il ​​tuo schema su come dovrebbe funzionare. Se lo imposti correttamente, questo può essere un enorme vantaggio per te.


6
2018-06-29 17:43



Usa questo metodo:

+ (void)Deletebeer:(NSString*)m_Beerid
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"Beers" inManagedObjectContext:context];
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
    [fetch setEntity:productEntity];
    NSPredicate *p=[NSPredicate predicateWithFormat:@"m_Beerid == %@", m_Beerid];
    [fetch setPredicate:p];
    //... add sorts if you want them
    NSError *fetchError;
     NSError *error;
    NSArray *fetchedProducts=[context executeFetchRequest:fetch error:&fetchError];
    for (NSManagedObject *product in fetchedProducts) {
        [context deleteObject:product];
    }
    [context save:&error];
}

6
2018-01-23 07:45



Usa questo

Entity  *entity = (Entity *)[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:managedObjectContext];
[entity setTimeStamp:[NSDate date]];
NSError *error;
if ([managedObjectContext save:&error]) {

}
[eventArray delete:<#(id)sender#>];

[self.tableView reloadData];

2
2018-05-16 07:26



Ho lavorato con UITableView per cancellare per qualche giorno, alla fine ho fatto le cose.

Il tableview è popolato dai dati dall'oggetto dei dati di base. I metodi dei delegati sono stati utilizzati sono:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSectin:(NSInteger)section**
{
   reture [_arrData count];
}

-(NSInteger)numberOfSectionInTablesView:(UITableView *)tableView
{
  return 1;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *cellID = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
  if(cell == nil){
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStleDefault reuseIdentifier:cellID];
  }
  cell.textLable.text = [_arrData objectAtIndex:indexPath.row];
  return cell;
}

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
  return YES;
}

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action,NSIndexPath *indexPath){


        //**************load address **************
        NSError *error;

        AppDelegate *sharedDelegate = [AppDelegate appDelegate];
        NSManagedObjectContext *context = [sharedDelegate managedObjectContext];

        NSEntityDescription *entity = [NSEntityDescription entityForName:@"data" inManagedObjectContext:context];

        NSFetchRequest *fetchReuqets = [[NSFetchRequest alloc] init];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lat == %@", [_arrLat objectAtIndex:indexPath.row]];
        [fetchReuqets setPredicate:predicate];

        NSLog(@"delete %@",[_arrLat objectAtIndex:indexPath.row]);

        [fetchReuqets setEntity:entity];
        NSArray *fetchedObjects = [context executeFetchRequest:fetchReuqets error:&error];
        NSLog(@"number of filtered objects=%ld",fetchedObjects.count);
        if(!error && fetchedObjects.count>0){
            for (NSManagedObject *addr in fetchedObjects){
                [context deleteObject:addr];
                NSLog(@"delete addr %@",addr);
            }
            [context save:&error];
        }
        //***************core data**************************
        [_arrData removeObjectAtIndex:indexPath.row];
        [tableView reloadData];

    }];
    delete.backgroundColor = [UIColor redColor];
    return @[delete];
}

Speriamo che aiuti qualcuno.


1
2018-06-03 06:44



Abbastanza semplice dove DatabaseInfo è il nome della mia entità, dove nomefile è un attributo

CoreAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Contacts" inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];

NSPredicate *pred= [NSPredicate predicateWithFormat:@"(filename = %@)", @"Thankyou"];

[request setPredicate:pred];
NSManagedObject *matches = nil;

NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];

if([objects count] == 0)
{
    _label1.text=@"No Match Found";
}
else{
    matches = objects[0];

    [context deleteObject:matches]    

}

0
2017-10-30 09:50