Arquivos de lista de propriedades, conhecidos como plist (Property List), representam uma forma eficiente e nativa de armazenar pequenos volumes de dados estruturados no ecossistema iOS. Eles utilizam o modelo de chave-valor para organizar informações serializadas, sendo ideais para configurações de usuários ou estados simples da aplicação.
1. Criação de Diretórios e Arquivos Plist
Para manipular arquivos no sistema de arquivos do iOS, utilizamos a classe NSFileManager. O exemplo abaixo demonstra como localizar o diretório de documentos do aplicativo, criar uma pasta personalizada e gerar o arquivo de destino.
NSFileManager *fileManager = [NSFileManager defaultManager];
// Localiza o caminho para o diretório Documents na Sandbox do app
NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// Define o caminho para um novo diretório chamado "AppData"
NSString *customDir = [docsPath stringByAppendingPathComponent:@"AppData"];
// Verifica se o diretório existe, caso contrário, cria-o
if (![fileManager fileExistsAtPath:customDir]) {
[fileManager createDirectoryAtPath:customDir withIntermediateDirectories:YES attributes:nil error:nil];
}
// Define o caminho completo do arquivo .plist
NSString *fullPath = [customDir stringByAppendingPathComponent:@"settings.plist"];
// Cria o arquivo fisicamente se ele não existir
if (![fileManager fileExistsAtPath:fullPath]) {
[fileManager createFileAtPath:fullPath contents:nil attributes:nil];
}
2. Inserção e Atualização de Informações
A escrita em arquivos plist é comumente feita através de dicionários (NSDictionary ou NSMutableDictionary). Ao salvar, o conteúdo anterior do arquivo é substituído pelo estado atual do objeto em memória.
// Instancia o dicionário principal para gerenciar os dados
NSMutableDictionary *rootData = [[NSMutableDictionary alloc] init];
// Cria um sub-dicionário com informações específicas
NSMutableDictionary *profileInfo = [[NSMutableDictionary alloc] init];
[profileInfo setObject:@"Joao_Silva" forKey:@"username"];
[profileInfo setObject:@"Premium" forKey:@"account_type"];
// Adiciona o sub-dicionário ao objeto principal usando uma chave identificadora
[rootData setObject:profileInfo forKey:@"user_profile"];
// Escreve os dados no arquivo de forma atômica para garantir integridade
BOOL success = [rootData writeToFile:fullPath atomically:YES];
if (success) {
NSLog(@"Dados gravados com sucesso!");
}
3. Remoção de Entradas Específicas
Para deletar um registro, é necessário carregar o conteúdo do arquivo em um objeto mutável, remover o objeto associado à chave desejada e salvar o arquivo novamente.
// Carrega o conteúdo atual do arquivo em um dicionário mutável
NSMutableDictionary *existingData = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath];
if (existingData) {
// Remove a entrada correspondente à chave informada
[existingData removeObjectForKey:@"user_profile"];
// Persiste a alteração no disco
[existingData writeToFile:fullPath atomically:YES];
}
4. Leitura e Consulta de Dados
A recuperação dos dados é direta. Basta inicializar um dicionário apontando para o caminho do arquivo no sistema.
// Lê o arquivo plist e armazena o conteúdo em um dicionário de leitura
NSDictionary *dataContent = [NSDictionary dictionaryWithContentsOfFile:fullPath];
if (dataContent != nil) {
NSLog(@"Conteúdo recuperado: %@", dataContent);
// Acessando um valor específico
NSDictionary *profile = [dataContent objectForKey:@"user_profile"];
NSLog(@"Username: %@", [profile objectForKey:@"username"]);
}