アプリでコアデータを使用していますが、コアデータストレージから特定の行またはエントリを削除するときに混乱します。私はいくつかの製品を次のようにストレージに挿入します:
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'
私はこれを理解することができないように見えるので、私はいくつかのサンプルコードに大いに感謝します。
助けてくれてありがとう。
@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];
}
次にコンテキストを保存すると、オブジェクトのデータが永続ストアファイルから削除されます。
Sqliteの「DELETE from tableName WHERE condition」のように、CoreDataからMULTIPLE
オブジェクトを削除する単一の手順はありません。
CoreDataでは、まずNSFetchRequest
とNSPredicate
を使用して、削除する必要があるオブジェクトを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];
}
Core DataはDBではなくグラフと考えてください。そのため、行の概念は適用されません。代わりに、グラフから特定のオブジェクトを削除します。
使いました insertNewObjectForEntityForName:inManagedObjectContext:
挿入します。使用する deleteObject:
削除するには、次のようにします。
[aContext deleteObject:aManagedObject];
あなたの場合、
[context deleteObject:Product];
幸運を
Appleの ここでの説明 を参照してください
注:スキームに応じて削除すると、異なる影響が生じる可能性があります。たとえば、Core Dataオブジェクトグラフの子パスのさらに下にあるすべてを削除できます。スキーマを設計するときは、それがどのように機能するかについてよく考えてください。あなたがそれを正しく設定すれば、これはあなたにとって大きな利点となります。
この方法を使用します。
+ (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];
}
これを使って
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];
私は数日間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];
}
うまくいけば誰かを助けます。
かなりシンプルです。ここで、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]
}
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{
}
}