web-dev-qa-db-ja.com

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'

私はこれを理解することができないように見えるので、私はいくつかのサンプルコードに大いに感謝します。

助けてくれてありがとう。

23
John S

@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のすべてのオブジェクトが含まれます。述語は、SQLのwhere句と論理的に同じ機能を果たすことに注意してください。

オブジェクトを取得したら、コンテキストにそれらを削除するように指示するだけです。

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

次にコンテキストを保存すると、オブジェクトのデータが永続ストアファイルから削除されます。

41
TechZen

Sqliteの「DELETE from tableName WHERE condition」のように、CoreDataからMULTIPLEオブジェクトを削除する単一の手順はありません。

CoreDataでは、まずNSFetchRequestNSPredicateを使用して、削除する必要があるオブジェクトをfetchする必要があります。

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を通じてiterateを実行し、NSManagedObjectContextからdeleteObject:を呼び出す必要があります。

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

Core DataはDBではなくグラフと考えてください。そのため、行の概念は適用されません。代わりに、グラフから特定のオブジェクトを削除します。

使いました insertNewObjectForEntityForName:inManagedObjectContext:挿入します。使用する deleteObject:削除するには、次のようにします。

[aContext deleteObject:aManagedObject];

あなたの場合、

[context deleteObject:Product];

幸運を

Appleの ここでの説明 を参照してください

注:スキームに応じて削除すると、異なる影響が生じる可能性があります。たとえば、Core Dataオブジェクトグラフの子パスのさらに下にあるすべてを削除できます。スキーマを設計するときは、それがどのように機能するかについてよく考えてください。あなたがそれを正しく設定すれば、これはあなたにとって大きな利点となります。

6
Nektarios

この方法を使用します。

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

これを使って

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

私は数日間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];
}

うまくいけば誰かを助けます。

1
showmyroutes

かなりシンプルです。ここで、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)
{
    _label1.text=@"No Match Found";
}
else{
    matches = objects[0];

    [context deleteObject:matches]    

}
0
Jasmeet

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