Core Data应用程序在保存时崩溃

时间:2013-08-06 10:23:23

标签: objective-c core-data nscoding

我收到以下错误[context save:&error]。我应该怎么解决?

  

无法识别的选择器发送给了课程    * - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiver在没有调用-finishEncoding的情况下解除分配。   * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [TempObject encodeWithCoder:]:   无法识别的选择器发送到类'

这里是我正在使用的代码。

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
PostRequest *postRequestObject = (PostRequest *)[NSEntityDescription   insertNewObjectForEntityForName:@"PostRequest" inManagedObjectContext:context];

DummyClass *request = OtherClassObject;
postRequestObject.request = request;
// request is attribute with type transformable
NSLog(@"requestpost data -> %@",postRequestObject.request);

NSError *error = nil;
if (![context save:&error]) {
    // Replace this implementation with code to handle the error appropriately.
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

#pragma mark - private method
- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"PostRequest" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:80];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"status" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];
    [sortDescriptor autorelease];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"root"] autorelease];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _fetchedResultsController;
}

1 个答案:

答案 0 :(得分:2)

错误消息显示您有一个名为TempObject的类,您尝试在其上调用encodeWithCoder:,并且此类未实现该方法。正如你所见,这是一个崩溃的错误。

您似乎在某处具有可转换的Core Data属性,并且您正在为此属性分配TempObject的实例。我不知道那是哪里。您的代码段提到了可转换的属性,但您未在代码中使用TempObject。我无法判断这段代码是否真的是导致崩溃的原因,或者是否由于某种原因手动更改了名称。

无论如何,当你有一个可转换的属性时,你必须做以下两件事之一:

  1. 让您的课程符合NSCoding。你在评论中说过,但你的错误信息表明你没有 - 或者至少你没有完成这项工作。 NSCoding定义了两种方法,initWithCoder:encodeWithCoder:,您的类必须同时实现这两种方法。

  2. 创建一个自定义NSValueTransformer子类,可以将对象转换为NSData,并配置核心数据模型以使用它。 Apple提供了几个非常好(但简单)的例子来说明如何做到这一点。

  3. 您为可转换属性指定的任何内容必须执行其中一项操作。哪一个取决于你。

    似乎你正试图做#1但尚未完成这项工作。确保您的班级符合NSCoding