Pergunta

Ok, é claro que é possível, isso não é problema. No meu código, tenho vários objetos com os quais trabalho e eles precisam ter dados persistentes. Para fazer isso, usei a codificação de objetos e armazenando -os em um arquivo de dados. Tal como:

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

E depois mais adiante em outra seção do código:

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]; 

E isso salva os objetos. Eu sei que funciona, porque posso retirá -los com este código:

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]);

Legal! Então agora eu posso armazenar meus objetos e lê -los. Então é aqui que entra o problema. Em uma aula diferente, retiro um dos objetos que estou armazenando e trabalho com ela. Nem todos eles, eu só li um. E então eu salvo novamente depois de alterar as configurações. Mas eu só salvo:

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];

Depois de fazer isso, todo o restante dos objetos que armazenei foi removido. Agora estou confuso, porque pensei que estava apenas editando a única chave "singleplayer", mas aparentemente isso de alguma forma remove o resto deles? Isso é suposto para acontecer? Eu tive alguns problemas ao lançar o arquiver, isso afetaria isso ... acho que não. Alguém tem algumas dicas sobre isso, porque eu não quero ter que retirar todos os objetos e reencodificá-los se eu quiser editar um deles ...

Obrigado pela ajuda!

Foi útil?

Solução

Você cria um novo arquiver, com um objeto de dados EMTPY. Você escreve o objeto singleplayer nos dados, mas não armazena o restante dos dados no mesmo arquivo, recém -criado.

Para fazer isso, desarquivo todo o arquivo armazenado anteriormente, ajuste o objeto singleplayer e arquiva e salve -o novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top