从Core-Data中删除特定条目/行

Joh*_*n S 23 iphone xcode core-data objective-c nsmanagedobject

我在我的应用程序中使用核心数据,当涉及从核心数据存储中删除某些行或条目时,我感到很困惑.我将一些产品插入存储器中,如下所示:

NSManagedObject *Product = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:context];
[Product setValue:[NSNumber numberWithFloat:id] forKey:@"pid"];
[Product setValue:[NSNumber numberWithFloat:quantity] forKey:@"pquantity"];
Run Code Online (Sandbox Code Playgroud)

这适用于插入.但是,稍后在应用程序中,我想删除条目,例如,pid是53.如何才能删除此行/条目?等效的SQL将是这样的:

DELETE from Product WHERE pid = '53'
Run Code Online (Sandbox Code Playgroud)

我非常感谢一些示例代码,因为我似乎无法想出这个代码.

谢谢你的帮助.

Tec*_*Zen 42

正如@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
Run Code Online (Sandbox Code Playgroud)

fetchedProducts数组将包含属性等于的实体Product的所有对象.请注意,谓词在逻辑上与SQL中的子句完成相同的功能.pidsoughtPidwhere

获得对象后,您只需告诉上下文删除它们:

  for (NSManagedObject *product in fetchedProducts) {
    [context deleteObject:product];
  }
Run Code Online (Sandbox Code Playgroud)

下次保存上下文时,将从持久性存储文件中删除对象的数据.


Bil*_*een 13

与Sqlite的"从tableName WHERE条件中删除"一样,您没有MULTIPLE从CoreData中删除对象的单一步骤.

CoreData中,首先必须使用和获取必须删除的对象NSFetchRequestNSPredicate

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];
Run Code Online (Sandbox Code Playgroud)

然后,你应该遍历每一个NSManagedObjectdeleteObject:从你的呼叫NSManagedObjectContext.

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

    //Save context to write to store
    [managedObjectContext save:nil];
}
Run Code Online (Sandbox Code Playgroud)


Nek*_*ios 6

请记住将Core Data视为图形而不是DB,因此行的概念不适用.相反,您想要从图表中删除特定对象.

insertNewObjectForEntityForName:inManagedObjectContext:以前插入它.使用deleteObject:来删除它,如:

[aContext deleteObject:aManagedObject];

在你的情况下,

[context deleteObject:Product];

祝好运

请参阅Apple的解释

注意:根据您的方案删除时,可能会产生不同的含义.例如,它可以删除Core Data对象图的子路径下的所有内容.确保在设计关于应该如何工作的模式时要认真思考.如果你设置正确,这对你来说是一个巨大的优势.


小智 6

使用此方法:

+ (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];
}
Run Code Online (Sandbox Code Playgroud)