2013-03-27 85 views
1

如何存储自定义对象NSMutableArray? 我有加载和保存文件的代码:ios存储自定义对象

- (NSMutableArray *)loadDataFromFile:(NSString *)fileName { 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex:0]; 
    NSString *path = [docDir stringByAppendingPathComponent:fileName]; 
    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    if (![fileMgr fileExistsAtPath:path]) { 
     NSArray *fileArray = [fileName componentsSeparatedByString:@"."]; 
     NSString *name = [fileArray objectAtIndex:0]; 
     NSString *ext = [fileArray objectAtIndex:1]; 
     NSString *bundle = [[NSBundle mainBundle] pathForResource:name ofType:ext]; 
     [fileMgr copyItemAtPath:bundle toPath:path error:&error]; 
    } 
    NSMutableArray *data = [[NSMutableArray alloc] initWithContentsOfFile:path]; 
    return data; 
} 

- (void)saveData:(NSMutableArray *)arrayData toFile:(NSString *)filename forKey:(NSString *)key { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex:0]; 
    NSString *path = [docDir stringByAppendingPathComponent:filename]; 
    [arrayData writeToFile: path atomically:YES]; 
    NSLog(@"%@", arrayData); 
} 

但是,当我用data.plist作为文件名,它没有工作,因为NSLog(@"%@", arrayData);返回列表自定义对象不会忽略:

“AreaTableRecord:0x76a7ef0”

此自定义对象使用此代码插入阵列

我该如何存储NSMutableArrayself.areas包含自定义对象AreaTableRecord? 和 什么文件格式shloud我用来存储这些数据? (在我看来,plist不起作用)

回答

1

您只能将原始数据类型存储在NSDefaults或plist中。为了解决这个问题,您可以选择将信息存储在数据库中....或将对象编码为字节流,然后将其保存到文件中。

看看这个thread。它详细介绍了如何编码你的对象。

基本上你需要将这些方法添加到您的自定义类:

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
     //Encode properties, other class variables, etc 
    [encoder encodeObject:self.question forKey:@\"question\"]; 
    [encoder encodeObject:self.categoryName forKey:@\"category\"]; 
    [encoder encodeObject:self.subCategoryName forKey:@\"subcategory\"]; 
} 


- (id)initWithCoder:(NSCoder *)decoder 
{ 
    self = [super init]; 
    if(self != nil) 
    { 
       //decode properties, other class vars 
     self.question = [decoder decodeObjectForKey:@\"question\"]; 
     self.categoryName = [decoder decodeObjectForKey:@\"category\"]; 
     self.subCategoryName = [decoder decodeObjectForKey:@\"subcategory\"]; 
    } 
    return self; 
} 

然后才能使用它们,你拨打电话是这样的:

有关设置:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
[defaults setObject:myEncodedObject forKey:@\"myEncodedObjectKey\"]; 

检索:

NSUserDefaults defaults = [NSUserDefaults standardUserDefaults]; 
NSData *myEncodedObject = [defaults objectForKey: key]; 
MyCustomObject* obj = (MyCustomObject*)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject]; 
+0

thx男人你救了我的命:D – 2013-03-29 02:06:59

+0

一个慷慨的答案!费里,给他投票! :) – Fattie 2014-08-01 11:03:50

相关问题