使用自定义对象编写NSDictionary到文件

时间:2014-05-29 17:30:07

标签: ios objective-c nsdictionary nsobject

我有一个NSDictionary,其中包含一组自定义对象,称为MAClass es。我尝试将dict写入文件,简单的方法:

- (void)writeDictToFileWithContent:(NSDictionary *)contentDict {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/userdata.txt"];


    [contentDict writeToFile:filePath atomically:YES];

}

然后我用

阅读
- (NSDictionary *)readFromDict {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/userdata.txt"];

    NSDictionary *contentDict = [NSDictionary dictionaryWithContentsOfFile:filePath];

    return contentDict;
}

我试图编写的对象数组是一个自定义的NSObject,它的结构有点像这样:

@interface MAAssignment : NSObject

@property (nonatomic, strong) NSDate *date;
@property (nonatomic, strong) NSString *assignmentName;
@property (nonatomic, strong) NSNumber *totalPoints;
@property (nonatomic, strong) NSNumber *recievedPoints;
@property (nonatomic, strong) NSNumber *classAverage;
@property (nonatomic, strong) NSNumber *extraCredit;
@property (nonatomic, strong) NSNumber *notGraded;

代表一个班级。

我之前只使用nsstrings和nsnumbers数组,它可以读写。当我切换MAClass对象时,它在我尝试读取时返回了一个空字典。

这可能是原因:iPhone - Writing NSMutableDictionary to file

我该怎么做来写这个字典呢?

2 个答案:

答案 0 :(得分:3)

你需要序列化你的自定义对象,一种方法是在你的自定义类中编写以下两种方法编码/解码你想要保存的每个属性,然后我不确定writeToFile是否会实际使用这个,但我知道您可以从对象创建NSData并使用以下方法将其写入文件

     //archive dictionary and serializable objects to NSData  
     NSData *serializedData= [NSKeyedArchiver archivedDataWithRootObject:myDict];

//Unarchive 
    NSData *myData=[NSData dataWithContentsOfFile:appFile];

    NSMutableDictionary* myDict= (NSMutableDictionary*)[NSKeyedUnarchiver unarchiveObjectWithData:myData];

以下是自定义对象中需要的两种方法:

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeInt:self.propOne forKey:@"PropOne"];
    [coder encodeObject:self.propTwo forKey:@"PropTwo"];
    ...

}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    self.propOne=[coder decodeIntegerForKey:@"PropOne"];
    self.propTwo=[coder decodeObjectForKey:@"PropTwo"];
     ..

    return self;
}

希望有所帮助

答案 1 :(得分:-2)

您无法使用自定义对象保存nsdictionary。尝试将编码形式的nsdictionary保存到文件并检索字典然后解码它。然后我想你会得到你的对象。 试试这个

- (void)writeDictToFileWithContent:(NSDictionary *)contentDict {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/userdata.txt"];

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:contentDict]; 
    [data writeToFile:filePath atomically:YES];


}

- (NSDictionary *)readFromDict {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/userdata.txt"];

    NSDictionary *contentDict = [NSDictionary dictionaryWithContentsOfFile:filePath];


    return [NSKeyedUnarchiver unarchiveObjectWithData:contentDict];;
}