2012-05-03 78 views
0

@interfaceNSKeyedArchiver不将数据写入文件...?

@interface Patient : NSObject <NSCoding> 

@implementation

- (id)initWithCoder:(NSCoder *)decoder{ 

    self.patientPhoto = [decoder decodeObjectForKey:kPatientPhoto]; 
    self.firstName = [decoder decodeObjectForKey:kFirstName]; 
    self.lastName = [decoder decodeObjectForKey:kLastName]; 
    self.age = [decoder decodeIntForKey:kAge]; 
    self.photoPaths = [decoder decodeObjectForKey:kPhotoPaths]; 
    self.photoDates = [decoder decodeObjectForKey:kPhotoDates]; 

    return self; 

    } 

- (void)encodeWithCoder:(NSCoder *)encoder{ 

     [encoder encodeObject:self.patientPhoto forKey:kPatientPhoto]; 
     [encoder encodeObject:self.firstName forKey:kFirstName]; 
     [encoder encodeObject:self.lastName forKey:kLastName]; 
     [encoder encodeInt:self.age forKey:kAge]; 
     [encoder encodeObject:self.photoPaths forKey:kPhotoPaths]; 
     [encoder encodeObject:self.photoDates forKey:kPhotoDates]; 

    } 

在不同的实现我尝试归档该患者对象。

 IMDataController* dataCtr = [IMDataController sharedDataController]; 

    Patient *currentPatient = [[Patient alloc]init]; 

    currentPatient.patientPhoto = self.photo.image; 
    currentPatient.firstName = self.firstName.text; 
    currentPatient.lastName = self.lastName.text; 
    currentPatient.age = [self.lastName.text intValue]; 
    currentPatient.photoDates = nil; 
    currentPatient.photoPaths = nil; 

    NSString *patientNameForWriting = [self.firstName.text stringByAppendingString:self.lastName.text]; 

    NSString *stringToPatientObjectFile = [dataCtr createPatient:patientNameForWriting]; 

    NSFileManager* filemanager = [NSFileManager defaultManager]; 

    NSData *patientObjectArchived = [NSKeyedArchiver archivedDataWithRootObject:currentPatient]; 


    if([patientObjectArchived writeToFile:stringToPatientObjectFile atomically:YES]){ 


    }else{ 

     NSLog(@"Patient Object Didn't Archive"); 

    } 

if语句中的上述方法没有返回YES。我检查了零的数据,我检查了我的编码器方法,我找不到问题。我正在将数据写入NSString文件路径:.../Documents/PatientName/PatientObject.archive。我也符合患者分类中的协议。

+0

你也许能够得到有关使用中出现问题的更多信息'writeToFile:options:error:'写入文件,然后检查'NSError'对象以获取详细信息。 – aroth

+0

createPatient:做什么?如果这不是创建完整的写入路径,那就是你的问题。 – rdelmar

+0

createPatient返回我的文件的完整路径。我用它来证实这条道路是正确的,事实确实如此。所以我不认为这个问题是我从NSObject继承的路径 – Michael

回答

1

确保父目录存在。据我记得,writeToFile:atomically:不会自动创建目录层次结构。

0

用以下替换您NSCoding实现:

- (id)initWithCoder:(NSCoder *)decoder{ 
    if (self = [super initWithCoder:(NSCoder *) decoder]) 
    { 
     self.patientPhoto = [decoder decodeObjectForKey:kPatientPhoto]; 
     self.firstName = [decoder decodeObjectForKey:kFirstName]; 
     self.lastName = [decoder decodeObjectForKey:kLastName]; 
     self.age = [decoder decodeIntForKey:kAge]; 
     self.photoPaths = [decoder decodeObjectForKey:kPhotoPaths]; 
     self.photoDates = [decoder decodeObjectForKey:kPhotoDates]; 
    } 
    return self; 

    } 

- (void)encodeWithCoder:(NSCoder *)encoder{ 
     [super encodeWithCoder:encoder]; 
     [encoder encodeObject:self.patientPhoto forKey:kPatientPhoto]; 
     [encoder encodeObject:self.firstName forKey:kFirstName]; 
     [encoder encodeObject:self.lastName forKey:kLastName]; 
     [encoder encodeInt:self.age forKey:kAge]; 
     [encoder encodeObject:self.photoPaths forKey:kPhotoPaths]; 
     [encoder encodeObject:self.photoDates forKey:kPhotoDates]; 

} 

,然后更改行:

NSData *patientObjectArchived = [NSKeyedArchiver archivedDataWithRootObject:currentPatient]; 

有:

NSMutableData *patientObjectArchived = [NSMutableData data]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: patientObjectArchived]; 
[archiver encodeObject:currentPatient forKey:@"someKey"]; 
[archiver finishEncoding]; 
+0

,它不符合NSCoding协议,是否仍然需要在超级方面调用initWIthCoder? – Michael