Хорошо, конечно, это возможно, это не проблема. В моем коде у меня есть несколько объектов, с которыми я работаю, и они должны быть постоянными данными. Для этого я использовал объектную кодировку и сохранил ее в файле данных. Такие, как:Можно ли хранить несколько объектов с помощью архивирования объектов?
-(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», но, видимо, это как-то удаляет остальных? Неужели это суждено случиться? У меня были некоторые проблемы с выпуском архиватора, это повлияло бы на это вообще ... Я не думаю, что так будет. Кто-нибудь знает об этом, потому что я не хочу, чтобы все объекты были удалены и перекодированы, если я хочу только отредактировать один из них ...
Спасибо за помощь!
Ugggh, что кажется ужасным неэффективным. Есть ли лучший способ сделать это? Возможно, я должен использовать SQLite вместо этого? –
Лучше переключиться на Core Data. Основные данные поддерживаются SQLite, но их можно использовать гораздо проще при работе с объектами и отношениями. – Joost
Независимо от того, используете ли Core Data или SQLite, полностью зависит от того, что вы пытаетесь сделать, и в настоящее время является предметом много дискуссий. http://inessential.com/2010/02/26/on_switching_away_from_core_data Кроме того, Core Data может использовать SQLite как тип хранилища, но SQLite больше не поддерживается SQLite, чем любой другой тип хранилища (такой как XML, двоичный, или какой-либо пользовательский тип хранилища). –