是否可以使用对象存档存储多个对象?

时间:2010-02-28 17:55:28

标签: iphone objective-c object data-persistence

好的,当然有可能,这没问题。在我的代码中,我有多个与之配合使用的对象,并且它们需要数据持久化。为此,我使用了对象编码并将它们存储在数据文件中。如:

-(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”,但显然它以某种方式删除了其余部分?那是不是发生了?我在发布归档器方面遇到了一些问题,这会对它产生什么影响......我认为不会。有没有人对此有一些了解,因为如果我只想编辑其中一个,我不想把所有的对象拿出来重新编码......

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

使用emtpy数据对象创建新的归档程序。您在数据中编写SinglePlayer对象,但不将其余数据存储在同一个新创建的存档中。

为此,取消归档整个先前存储的存档,然后调整SinglePlayer对象并存档并再次保存。