【问题标题】:Can not delete an entity from Core Data, using RestKit 0.20无法从核心数据中删除实体,使用 RestKit 0.20
【发布时间】:2013-02-12 08:33:11
【问题描述】:

下面的代码不会删除实体。控制台上会显示“删除成功”消息,以便找到实体。我使用的所有其他操作都成功。

我正在使用 RestKit 0.20。

NSManagedObjectContext *context = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
NSError *error = nil;

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName:@"Auction" inManagedObjectContext:context]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"AuctionID = %d", auctionID];
[fetchRequest setPredicate:predicate];

NSArray *result = [context executeFetchRequest:fetchRequest error:&error];
if(result.count) {
    Auction *block = result[0];
    [context deleteObject:block];
    BOOL status = [context save:&error];
    if (status == NO) {
        NSLog(@"delete falied for AuctionID:%d, error: %@", auctionID, error);
    }
    else {
        [context processPendingChanges];
        NSLog(@"delete was successful for AuctionID:%d", auctionID);

    }
}

为什么这个删除操作可能不成功,解决办法是什么。

【问题讨论】:

  • 删除实例后在哪里看到?
  • 我在模拟器中的 *.sqlite 文件上使用了第 3 方工具“Base”。我可以使用该工具删除实体。
  • 我实际上想知道问题的症状是什么,以及何时发生。您说您在删除数据时遇到问题,那么您什么时候才能看到您认为已删除的项目?
  • 他们没有删除,我还能说什么?数据在应用程序启动之前就在那里,当应用程序删除时仍然在那里。我已经删除了 *sqlite 文件,用相同的程序添加了条目,它们不会删除。我想知道的是,RestKit 0.2 是否有什么东西会导致某种锁定?我在 6.1 模拟器中运行。
  • 我找到了解决办法,看我的回答。

标签: ios core-data restkit restkit-0.20


【解决方案1】:

@兰斯 嘿,请用最新版本更新你的 restkit。 现在,如果您的服务器相关配置正确,这适用于最新版本。如果您从服务器获得删除请求的成功代码。然后,restkit 会自动删除数据。

如果需要在外部删除任何数据,可以使用persistentStoreManagedObjectContext,删除后保存。

另外,如果您想在最后检查它是否通过 restkit 正确删除。你能做的是……

发出删除请求,成功后 如果项目存在,请检查相同的 ID。 (只是为了帮助)

【讨论】:

    【解决方案2】:

    @Sumitiscreative 我今天遇到了同样的问题。如果发现通常使用 Core Data 你必须使用

    [NSManagedObject save:] 
    

    让它存储更改。我通过 Restkit 挖掘了一下,发现了这个

    [[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext deleteObject:(NSManagedObject *)];
    [[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext saveToPersistantStore:(NSError *)];
    

    在上述删除方法之后调用它可以将对象从数据库中删除。

    **编辑 - 我也想发表评论,但我没有选择

    【讨论】:

      【解决方案3】:

      我找到了这个解决方案:

      事实上,您必须从持久存储中获取数据,而不是从当前创建的托管上下文中获取数据:

      NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyModel"];
      NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:NO];
      fetchRequest.sortDescriptors = @[descriptor];
      
      // Setup fetched results
      NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                              managedObjectContext:[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext
                                                                                sectionNameKeyPath:nil
                                                                                         cacheName:nil];
      
      // AND TO DELETE A MODEL :
      
      [[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext deleteObject:myobject];
      

      【讨论】:

      • 谢谢 :) 如果您找到更好的解决方案,请不要犹豫
      • 这确实解决了问题。问题在于上下文,[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext 是准确的解决方法。
      【解决方案4】:

      我正在做同样的事情并且拥有几乎相同的代码。 在我的代码中,我也完成了删除并保存了......

      但是,当我检查数据库时,它并没有被删除。

      问题不在于模拟器...当然 bcz 我在设备上也遇到了同样的问题。 有一种叫做子上下文的东西,这可能是原因...检查这些链接http://restkit.org/api/0.20.0-dev/Classes/RKManagedObjectRequestOperation.html#//api/name/managedObjectContext RestKit 0.20 — What is the preferred way to create a new NSManagedObject? .如果您找到解决方案,请在此处分享

      【讨论】:

      • 确保你们在停止应用程序后检查数据库。因为除非有联系,否则不会反映更改。因此,删除-> 断开连接并检查。在我的情况下,这样检查后仍未删除。是的,现在我可以明确删除它,但那是错误的,它应该只由 restkit 删除。如果你们中的任何人得到解决方案,请在此处发布
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多