ios хранит пользовательские объекты

Как я могу сохранить NSMutableArray настраиваемых объектов? У меня есть этот код для загрузки и сохранения файлов:

- (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"

Этот настраиваемый объект вставляется в массив с помощью этого кода:

AreaTableRecord *area=[[AreaTableRecord alloc] init];
        area.title=title;
        area.lastScore=0;
        area.vocabulary=[[NSMutableArray alloc] init];
        [self.areas addObject:area];

Как я могу сохранить NSMutableArray self.areas, содержащий настраиваемые объекты AreaTableRecord? и какой формат файла shloud я использую для хранения этих данных? (мне кажется, что plist в этом случае не работает)


person feri baco    schedule 27.03.2013    source источник


Ответы (1)


Вы можете хранить только примитивные типы данных в NSDefaults или plist. Чтобы обойти это, вы можете либо сохранить свою информацию в базе данных ..., либо закодировать свои объекты как потоки байтов, а затем сохранить их в файл.

Взгляните на эту ветку. В нем подробно описано, как кодировать ваши объекты.

В основном вам нужно добавить эти методы в свой собственный класс:

- (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];
person Max    schedule 27.03.2013