CoreData:错误:使用NSCoding时,无法调用NSManagedObject类上指定的初始值设定项



我在运行应用程序时不断收到此错误:"CoreData:error:未能调用NSManagedObject类"Ambulance"上的指定初始值设定项"。我已经在堆栈溢出上看到了这个问题,但我不确定如何在我的情况下实现解决方案。有什么想法吗?

救护车.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Ambulance : NSManagedObject
@property (nonatomic, retain) NSString * ambulanceID;
@property (nonatomic, retain) NSNumber * distance;
@property (nonatomic, retain) NSNumber * etaDistance;
@property (nonatomic, retain) NSString * emsID;
@property (nonatomic, retain) NSString * lat;
@property (nonatomic, retain) NSString * lng;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * occupancy;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * websocketServer;
@property (nonatomic, retain) NSNumber * seconds;
@property (nonatomic, retain) id eta;
+(Ambulance *)nearestAmbulanceByType:(NSString *)type;

- (id)initWithCoder:(NSCoder *)decoder;
- (void)encodeWithCoder:(NSCoder *)encoder;

@end

救护车.m

#import "Ambulance.h"

@implementation Ambulance
@synthesize ambulanceID;
@synthesize distance;
@synthesize etaDistance;
@synthesize emsID;
@synthesize lat;
@synthesize lng;
@synthesize name;
@synthesize occupancy;
@synthesize type;
@synthesize websocketServer;
@synthesize seconds;
@synthesize eta;

+(Ambulance *)nearestAmbulanceByType:(NSString *)type {
NSArray *sortedArray = [Ambulance findByAttribute:@"type" withValue:type         andOrderBy:@"distance" ascending:YES];
return [sortedArray first];
 }

  - (void)encodeWithCoder:(NSCoder *)encoder {
//Encode properties, other class variables, etc
[encoder encodeObject:self.ambulanceID forKey:@"ambulanceID"];
[encoder encodeObject:self.distance forKey:@"distance"];
[encoder encodeObject:self.etaDistance forKey:@"etaDistance"];
[encoder encodeObject:self.emsID forKey:@"emsID"];
[encoder encodeObject:self.lat forKey:@"lat"];
[encoder encodeObject:self.lng forKey:@"lng"];
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeObject:self.occupancy forKey:@"occupancy"];
[encoder encodeObject:self.type forKey:@"type"];
[encoder encodeObject:self.websocketServer:@"websocketServer"];
[encoder encodeObject:self.seconds forKey:@"seconds"];
[encoder encodeObject:self.eta forKey:@"eta"];
}
- (id)initWithCoder:(NSCoder *)decoder {

if((self = [super init])) {
    //decode properties, other class vars

    self.ambulanceID = [decoder decodeObjectForKey:@"ambulanceID"];
    self.distance = [decoder decodeObjectForKey:@"distance"];
    self.etaDistance = [decoder decodeObjectForKey:@"etaDistance"];
    self.emsID = [decoder decodeObjectForKey:@"emsID"];
    self.lat = [decoder decodeObjectForKey:@"lat"];
    self.lng = [decoder decodeObjectForKey:@"lng"];
    self.name = [decoder decodeObjectForKey:@"name"];
    self.occupancy = [decoder decodeObjectForKey:@"occupancy"];
    self.type = [decoder decodeObjectForKey:@"type"];
    self.websocketServer = [decoder decodeObjectForKey:@"websocketServer"];
    self.seconds = [decoder decodeObjectForKey:@"seconds"];
    self.eta = [decoder decodeObjectForKey:@"eta"];
}
return self;
}

您应该为NSManagedObject子类使用除initWithEntity:insertIntoManagedObjectContext:之外的任何其他初始值设定项。

来自文档:

重要提示:此方法是的指定初始值设定项NSManagedObject。不能仅通过以下方式初始化托管对象发送init。

你确定你的子类必须使用NSCoding吗?存储objectID可能就足够了,因为您的对象存在于NSManagedObjectContext中,并且可能无论如何都会被持久化。

如果您真的依赖于NSCoding,则必须确定适当的NSManagedObjectContext并将其提供给initWithCoder:中的initWithEntity:insertIntoManagedObjectContext:

不确定这与RestKit有什么关系,以及为什么您认为需要支持编码。

假设您正在使用RestKit,您应该能够更改为:

- (id)initWithCoder:(NSCoder *)decoder {
    NSManagedObjectContext *moc = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ambulance" inManagedObjectContext:moc];
    if((self = [super initWithEntity:entity insertIntoManagedObjectContext:moc])) {
    ...

如果你不使用RestKit,那么你需要一种不同的方式来获得MOC。

最新更新