É possível armazenar vários objetos usando arquivamento de objetos?
-
23-09-2019 - |
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!
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.