【问题标题】:iPhone - App crashes when trying to save new objects after deleting objects in CoreDataiPhone - 在删除 CoreData 中的对象后尝试保存新对象时应用程序崩溃
【发布时间】:2011-08-24 21:23:41
【问题描述】:

好的,我在删除存储在 CoreData 中的所有对象后保存时遇到问题。如果我不删除任何内容,我在保存时没有问题,但是只要我要求它删除所有对象(所有内容都会删除而没有错误或问题),然后再次尝试保存,它就会崩溃并给我一个 程序收到信号:SIGABRT。这是我的代码。

- (void)deleteStoredData
{
    // Define our table/entity to use  
    NSEntityDescription *entity = [NSEntityDescription entityForName:MOVIE_LIST inManagedObjectContext:managedObjectContext];

    // Setup the fetch request  
    NSFetchRequest *request = [[NSFetchRequest alloc] init];  
    [request setEntity:entity];

    // Fetch the records and handle an error  
    NSError *error;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error];

    if (count) {
        for (int i = 0; i < count - 1; i++) {
            NSManagedObject *eventToDelete = [self.listOfMovies objectAtIndex:i];
            [managedObjectContext deleteObject:eventToDelete];
        }
    }

    [request release];
}

我认为可能是我将 self.listOfMovies 与存储的对象进行比较,所以我重新获取,将其复制到临时 NSMutableArray,然后将 self.listOfMovies 替换为 temp。但没有变化,仍然崩溃。我是否有一些方法删除了整个记录并且它不再存在?

我要做的是将所有内容加载到应用程序中,然后删除 CoreData 中的所有对象,以便在应用程序关闭(或终止)时将所有新数据保存在记录中。我这样做是否正确,还是有更简单的方法来做到这一点?哦,是的,我只有一个拥有 5 个 NSString 的实体,所以没什么复杂的。

在此先感谢大家。

【问题讨论】:

  • 很难说你想做什么。对您的数据模型、发生错误的行以及您遇到的实际错误进行高级描述会非常有帮助。
  • 我的模型中只有一个实体。称为电影。该实体有 5 个属性是 NSString 的。如果我所做的只是保存,一切都会完美保存。它可以毫无问题地获取。仅当我尝试删除对象然后稍后保存时才会出现此问题。它在保存并在主应用程序上提供 SIGABRT 时崩溃。
  • 此代码将从持久存储中删除所有 MOVIE_LIST 对象及其所有数据。那是你想做的吗?
  • 是的。 Christophers 的回答有效,但我也发现我的模拟器很糟糕,需要重新安装。

标签: iphone ios ipad core-data


【解决方案1】:

可能,当您调用 save 方法时,可能会与某些变量混淆,例如 managedObjectContext

您是否尝试在删除后立即保存(即在您上面的 deleteStoredData 方法中)?

顺便说一句,我也会使用 Christopher 的代码;-)。

【讨论】:

  • 我将代码更改为 Christopher 建议的内容,但没有帮助。是的,我尝试在删除后保存。那就是它发生的时候。如果我不删除任何内容,我可以保存一整天。但是,一旦我尝试删除一个对象,程序就会崩溃,并出现 SIGABRT 错误。
  • 也许你的持久存储坏了?尝试重置模拟器。
  • 好的,看起来就是这样。模拟器是一个会做饭的人。我在手机上加载了应用程序,它运行良好。现在我只需要弄清楚为什么它会加载错误。谢谢。
【解决方案2】:

使用这样的 for 循环删除托管对象很容易出错,并且可能会损坏 managedObjectContext。请尝试以下操作:

NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease];

[fetch setEntity:[NSEntityDescription entityForName:MOVIE_LIST inManagedObjectContext:context]];

NSArray * result = [context executeFetchRequest:fetch error:nil];

for (NSManagedObject * event in result) {
    [context deleteObject:event];
}

【讨论】:

  • 试过这个,但同样的问题。这让我发疯了……哈哈。
  • 这有助于减少错误,但我发现我的问题是需要重置并重新安装模拟器。谢谢。
【解决方案3】:

由于您的数组中已经包含了所有 managedObject,您不需要再进行一次提取,只需使用下面的代码删除它们就可以了。

for (NSUInteger i = 0; i < [self.listOfMovies count] - 1; i++) {
    NSManagedObject *eventToDelete = [self.listOfMovies objectAtIndex:i];
    [managedObjectContext deleteObject:eventToDelete];
}

如果仍然有问题,请告诉我您的 App 中有多少个 managedObjectContext?您是在后台线程中删除还是保存?

另外,请您在您的应用程序崩溃后,在控制台中输入“bt -> enter key”来发布崩溃日志和信息吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多