2010-02-28 3 views
1

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

-(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», но, видимо, это как-то удаляет остальных? Неужели это суждено случиться? У меня были некоторые проблемы с выпуском архиватора, это повлияло бы на это вообще ... Я не думаю, что так будет. Кто-нибудь знает об этом, потому что я не хочу, чтобы все объекты были удалены и перекодированы, если я хочу только отредактировать один из них ...

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

ответ

3

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

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

+0

Ugggh, что кажется ужасным неэффективным. Есть ли лучший способ сделать это? Возможно, я должен использовать SQLite вместо этого? –

+0

Лучше переключиться на Core Data. Основные данные поддерживаются SQLite, но их можно использовать гораздо проще при работе с объектами и отношениями. – Joost

+0

Независимо от того, используете ли Core Data или SQLite, полностью зависит от того, что вы пытаетесь сделать, и в настоящее время является предметом много дискуссий. http://inessential.com/2010/02/26/on_switching_away_from_core_data Кроме того, Core Data может использовать SQLite как тип хранилища, но SQLite больше не поддерживается SQLite, чем любой другой тип хранилища (такой как XML, двоичный, или какой-либо пользовательский тип хранилища). –

Смежные вопросы