我有一个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
我该怎么做来写这个字典呢?
答案 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];;
}