2012-05-03 80 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