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.
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.
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];
}
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.
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];
}
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];
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.
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]
}
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{
}
}