Можно ли хранить несколько объектов с помощью архивации объектов?

StackOverflow https://stackoverflow.com/questions/2351954

Вопрос

Хорошо, конечно, это возможно, это не проблема.В моем коде есть несколько объектов, с которыми я работаю, и они должны сохранять данные.Для этого я использовал кодирование объектов и сохранил их в файле данных.Такой как:

-(NSString *)dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

И затем дальше в другом разделе кода:

NSMutableData *data = [[NSMutableData alloc] init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        NSLog(@"Test 4");
        [archiver encodeObject:playerTwo forKey:@"PlayerTwoObject"];
        [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"];
        [archiver encodeObject:playerOne forKey:@"PlayerOneObject"];
        [archiver encodeObject:settings forKey:@"Settings"];


        [archiver finishEncoding];
        [data writeToFile:[self dataFilePath] atomically:YES];
        [singlePlayer release];
        [playerOne release];
        [playerTwo release];
        [settings release]; 

И это сохраняет объекты.Я знаю, что это работает, потому что я могу удалить их с помощью этого кода:

unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]];
    SettingsObject *settings = [unarchiver decodeObjectForKey:@"Settings"];
    Player *test = [unarchiver decodeObjectForKey:@"PlayerOneObject"];
    NSLog(@"Power On Settings Test: %d,%d", [settings playerOneStartingLife], [settings singlePlayerStartingLife]);
    NSLog(@"Power On Player Test: %@,%d", [test name], [test life]);

Прохладный!Итак, теперь я могу хранить свои объекты и считывать их. Вот здесь и возникает проблема. В другом классе я беру один из сохраняемых объектов и работаю с ним.Не все, я зачитал только одно.А потом сохраняю снова после изменения настроек.Но я сохраняю только это:

NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];
    [singlePlayer release];

После этого все остальные объекты, которые я сохранил, будут удалены.Теперь я в замешательстве, потому что думал, что редактирую только один ключ «SinglePlayer», но, видимо, это каким-то образом удаляет остальные?Предполагается ли, что это произойдет?У меня были проблемы с выпуском архиватора, повлияет ли это вообще...Я не думаю, что это будет.Есть ли у кого-нибудь какое-нибудь представление об этом, потому что я не хочу вынимать все объекты и перекодировать их, если я хочу отредактировать только один из них...

Спасибо за вашу помощь!

Это было полезно?

Решение

Вы создаете новый архиватор с объектом данных emtpy.Вы записываете в данные объект SinglePlayer, но не сохраняете остальные данные в том же, вновь созданном архиве.

Для этого разархивируйте весь ранее сохраненный архив, затем настройте объект SinglePlayer, заархивируйте и сохраните его снова.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top