2013-08-06 3 views
0

Я получил следующую ошибку: [context save:&error]. Как мне исправить?Сбой при работе с Core Data при сохранении

непризнанным селектор послал к классу * - [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; 
} 
+0

Является ли это обсуждение таким же, как http://stackoverflow.com/questions/18072849/core-data-unresolved-error-app-crashs-on-save? Если да, удалите этот вопрос (или предыдущий), пожалуйста. –

+0

И ** контекст может быть полезным **. Какие данные вы пытаетесь сохранить? –

+0

Данные - это запрос с параметрами. – yogwiz

ответ

2

Сообщение об ошибке говорит, что у вас есть класс с именем TempObject, что вы пытаетесь вызвать encodeWithCoder: на него, и что этот класс не реализует этот метод. Это крутая ошибка, как вы видите.

Похоже, что у вас есть трансформируемый атрибут Core Data где-то, и что вы присваиваете этому атрибуту экземпляр TempObject. Я не знаю, где это. В фрагменте кода упоминается трансформируемый атрибут, но вы не используете TempObject в коде. Я не могу сказать, действительно ли этот код является причиной сбоя или если вы поменяли имя вручную по какой-то причине.

Во всяком случае, когда у вас есть трансформируемый атрибут, вы должны сделать одну из двух вещей:

  1. Сделайте ваш класс соответствовать NSCoding. Вы сказали в комментарии, что вы это сделали, но ваше сообщение об ошибке говорит, что вы не ... или, по крайней мере, не закончили работу. NSCoding определяет два метода: initWithCoder: и encodeWithCoder:, и ваш класс должен реализовать оба из них.

  2. Создайте пользовательский подкласс NSValueTransformer, который может преобразовать ваш объект в/из NSData и сконфигурировать вашу модель Core Data, чтобы использовать это. Apple предоставляет пару действительно хороших (но простых) примеров того, как это сделать.

Все, что вы назначаете трансформируемой атрибут сусло сделать один из них. Какой из них вам подходит.

Это кажется, что вы пытаетесь сделать # 1, но не закончили работу. Убедитесь, что ваш класс соответствует NSCoding.

+0

Спасибо @Tom, полезная информация. – yogwiz