Подтвердить что ты не робот

Удаление определенной записи/строки из Core-Data

Я использую основные данные в своем приложении, и я смущен, когда дело доходит до удаления определенных строк или записей из основного хранилища данных. Я вставляю некоторые продукты в хранилище, например:

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

Это отлично подходит для вставки. Однако позже в приложении я хочу удалить запись, где, например, pid равно 53. Как я могу удалить только эту строку/запись? Эквивалентный SQL будет примерно таким:

DELETE from Product WHERE pid = '53'

Я был бы очень признателен за примерный код, поскольку я не могу представить его.

Спасибо за любую помощь.

4b9b3361

Ответ 1

Как сказал @Nektarios, вы имеете дело с объектами здесь, поэтому хотите найти объект с определенным значением атрибута. Вы это с запросом на выборку и предикатом.

  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

Массив fetchedProducts будет содержать все объекты объекта Product, атрибут pid которого равен soughtPid. Обратите внимание, что предикат выполняет ту же функцию логически, что и предложение where в SQL.

Как только у вас есть объекты, вы просто скажете контексту, чтобы удалить их:

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

При следующем сохранении контекста данные объекта будут удалены из файла постоянного хранилища.

Ответ 2

Как и Sqlite "DELETE from tableName WHERE condition", у вас нет единственного шага для удаления объектов MULTIPLE из CoreData.

В CoreData​​strong > сначала нужно извлечь объекты, которые необходимо удалить, используя NSFetchRequest и 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];

Затем вы должны итерации через каждые NSManagedObject и вызвать deleteObject: из NSManagedObjectContext.

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

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

Ответ 3

Не забудьте подумать о Core Data как о графике, а не о DB, поэтому концепция строк не применяется. Вместо этого вы хотите удалить определенный объект из графика.

Вы использовали insertNewObjectForEntityForName:inManagedObjectContext:, чтобы вставить его. Используйте deleteObject:, чтобы удалить его, например:

[aContext deleteObject:aManagedObject];

В вашем случае

[context deleteObject:Product];

Удачи.

См. описание Apple здесь

Примечание: при удалении, в зависимости от вашей схемы, это может иметь разные последствия. Например, он может удалять все дальше по дочернему пути вашего графа объектов Core Data. Удостоверьтесь, что вы много думали при разработке своей схемы о том, как это должно работать. Если вы настроите это правильно, это может быть огромным преимуществом для вас.

Ответ 4

Используйте этот метод:

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

Ответ 5

используйте этот

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

Ответ 6

Я работаю с удалением UITableView для удаления в течение нескольких дней, в конце концов, я все сделал.

Отображение таблицы заполняется данными из основного объекта данных. Использованы методы делегата:

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

Надеюсь помочь кому-то.

Ответ 7

Pretty Simple, где DatabaseInfo - это имя моей сущности, где filename является атрибутом

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)
{
    [email protected]"No Match Found";
}
else{
    matches = objects[0];

    [context deleteObject:matches]    

}

Ответ 8

В 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{

                }
            }