web-dev-qa-db-fra.com

Supprimer une entrée/ligne spécifique de Core-Data

J'utilise des données de base dans mon application et je suis confus en ce qui concerne la suppression de certaines lignes ou entrées du stockage de données de base. J'insère des produits dans le stockage comme ceci:

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

Cela fonctionne très bien pour l'insertion. Cependant, plus tard dans l'application, je souhaite supprimer l'entrée où, par exemple, le pid est égal à 53. Comment pourrais-je supprimer uniquement cette ligne/entrée? Le SQL équivalent serait quelque chose comme: 

DELETE from Product WHERE pid = '53'

J'apprécierais beaucoup un exemple de code, car je n'arrive pas à comprendre celui-ci.

Merci pour toute aide.

23
John S

Comme @Nektarios l'a dit, vous avez affaire à des objets ici, vous voulez donc trouver un objet ayant une valeur d'attribut particulière. Vous cela avec une requête d'extraction et un prédicat. 

  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

Le tableau fetchedProducts contient tous les objets de l'entité Product dont l'attribut pid est égal à soughtPid. Notez que le prédicat remplit logiquement la même fonction que la clause where en SQL.

Une fois que vous avez les objets, indiquez simplement le contexte pour les supprimer:

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

Lors de la prochaine sauvegarde du contexte, les données de l'objet seront supprimées du fichier de stockage persistant. 

42
TechZen

Comme dans la condition "DELETE from nomTable WHERE" de SQLite, vous n'avez pas la moindre étape pour supprimer des objets MULTIPLE de CoreData.

Dans CoreData, vous devez d'abord fetch des objets à supprimer, en utilisant NSFetchRequest et 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];

Ensuite, vous devriez iterate dans chaque NSManagedObject et appeler deleteObject: à partir de votre NSManagedObjectContext.

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

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

N'oubliez pas de considérer les données essentielles comme un graphique et non comme une base de données, afin que le concept de lignes ne s'applique pas. Au lieu de cela, vous souhaitez supprimer un objet spécifique du graphique.

Vous avez utilisé insertNewObjectForEntityForName:inManagedObjectContext: pour l'insérer. Utilisez deleteObject: pour le supprimer, par exemple:

[aContext deleteObject:aManagedObject];

Dans ton cas,

[context deleteObject:Product];

Bonne chance

Voir l'explication d'Apple ici

Remarque: lorsque vous supprimez, selon votre schéma, cela peut avoir différentes implications. Par exemple, il peut supprimer tout ce qui se trouve plus loin dans le chemin enfant de votre graphe d'objets Core Data. Assurez-vous de bien réfléchir à la manière dont cela devrait fonctionner lors de la conception de votre schéma. Si vous le configurez correctement, cela peut être un avantage énorme pour vous.

6
Nektarios

Utilisez cette méthode:

+ (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
Superdev

utilisez ceci

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
user1387047

Je travaille avec UITableView glisser à supprimer depuis quelques jours, j'ai finalement fait des choses. 

La vue de table est renseignée par les données de l'objet de données principal. Les méthodes déléguées utilisées sont:

-(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];
}

J'espère aider quelqu'un.

1
showmyroutes

Pretty Simple où DatabaseInfo est le nom de mon entité, où nomfichier est un attribut

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
Jasmeet

Dans Swift 3:

         if let dataAppDelegatde = UIApplication.shared.delegate as? AppDelegate {


                let mngdCntxt = dataAppDelegatde.persistentContainer.viewContext

                let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ItemCart")

                let predicate = NSPredicate(format: "itemId = %i", Int(currentItemID)!)
                print(currentItemID)

                fetchRequest.predicate = predicate
                do{
                    let result = try mngdCntxt.fetch(fetchRequest)

                    print(result.count)

                    if result.count > 0{
                        for object in result {
                            print(object)
                            mngdCntxt.delete(object as! NSManagedObject)
                        }
                    }
                }catch{

                }
            }
0
Sandu