Pergunta

Eu tenho um objeto personalizado que simplesmente herda de NSObject. Tem 3 membros -. Dois carros alegóricos e um NSDate

Meu aplicativo vai ter um array com um número desses objetos chutando por aí, e eu preciso persistir lo entre as execuções. Como posso fazer isso?

Já pensou em usar um db SQLite, mas eu estou pensando que é um pouco exagerado já que a única consulta que eu já não seria select *.

Em um mundo ideal eu gostaria de usar um arquivo xml plist. Eu não tenho certeza se eu posso fazer isso com o meu objeto personalizado embora. Eu sei que há um conjunto de lista de propriedades objetos, e que NSArray vem sob isso, mas writeToFile:atomically: só funciona com objetos lista de propriedades.

Qualquer pensamento seria apreciada, obrigado!

Foi útil?

Solução

NSCoding vai fazer exatamente o que você quer. Eu recomendo que você ler sobre ele nos docs da Apple, mas eu pensei que era bastante simples de usar. Sua classe (e quaisquer classes filho) terá de implementar o protocolo NSCoding e você vai precisar adicionar métodos -encodeWithCoder: e -initWithCoder: a seus objetos. A maioria das classes quadro comum implementar NSCoding já.

O código para a sua classe será algo parecido com isto:

-(void) encodeWithCoder: (NSCoder*) coder {
  [coder encodeInteger: versionValue forKey: versionKey];
  [coder encodeObject: myStuff forKey: myStuffKey];
}

-(id) initWithCoder: (NSCoder*) coder {
  self = [super init];
  if ( ! self) return nil;
  myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
  return self;
}

É recomendado que você adicionar um número de versão quando a codificação para lhe dar flexibilidade para gerenciar alterações em seu formato de arquivo em versões futuras.

Na minha classe, eu adicionei um método de conveniência para arquivar meu objeto:

-(void) archiveToFile: (NSString*) path {
  NSMutableData *data = [[NSMutableData alloc] init];
  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
  [archiver encodeObject: self forKey: myArchiveKey];
  [archiver finishEncoding];
  [archiver release];
  [data writeToFile: path atomically: YES];
  [data release];
}

e outro para desarquivar ou criar um novo objeto:

+(MyArchive*) newFromFile: (NSString*) path
            orWithMyStuff: (MyStuff*) myStuff
{
  NSData *data = [[NSData alloc] initWithContentsOfFile: path];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
  MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
  [unarchiver finishDecoding];

  if (myArchive) {
    [myArchive retain];
  } else {
    myArchive = [[MyArchive alloc] initWithStuff: myStuff;
  }
  [unarchiver release];
  [data release];
  return myArchive;
}

Uma vez que o objeto de nível superior é uma NSArray, você vai precisar modificar os últimos dois métodos para o seu caso, mas a maior parte do código clichê será o mesmo.

Outras dicas

Se você vai querer recuperar um subconjunto dos objetos, SQLite é de longe a melhor opção.

Se não, é uma escolha entre o formato plist e NSCoding. plist exige que você seja capaz de converter seus objetos personalizados em algo plist-friendly e, em seguida, converter a volta plist em seus objetos, mas NSCoding é um pouco mais difícil de quebrar a cabeça ao redor e não podem ser facilmente editadas (ou examinados) à mão .

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