【问题标题】:Is it possible to store multiple objects using object archving?是否可以使用对象归档存储多个对象?
【发布时间】:2010-02-28 17:55:28
【问题描述】:

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

-(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”,但显然这会以某种方式删除其余部分?这应该会发生吗?我在发布存档器时遇到了一些问题,这会不会影响它……我认为不会。有没有人对此有所了解,因为如果我只想编辑其中一个对象,我不想将所有对象取出并重新编码...

感谢您的帮助!

【问题讨论】:

    标签: iphone objective-c object data-persistence


    【解决方案1】:

    您创建一个新的存档器,其中包含一个 emtpy 数据对象。您将 SinglePlayer 对象写入数据中,但不会将其余数据存储在同一个新创建的存档中。

    为此,解压缩之前存储的整个存档,然后调整 SinglePlayer 对象并存档并再次保存。

    【讨论】:

    • Ugggh,这似乎效率低下。有没有更好的方法来做到这一点?也许我应该改用 SQLite?
    • 那么最好切换到 Core Data。 Core Data 由 SQLite 支持,但在处理对象和关系时可以更轻松地使用。
    • 使用 Core Data 还是 SQLite 完全取决于您要做什么,并且目前是很多争论的主题。 inessential.com/2010/02/26/on_switching_away_from_core_data 此外,Core Data 可以使用 SQLite 作为存储类型,但它并不比任何其他存储类型(例如 XML、二进制或某些自定义存储类型)更受 SQLite 的“支持”。
    • 是的,没错。但是当不使用 SQLite 作为 Core Data 存储类型时,加载所有数据,然后只调整一个属性,然后再次保存所有数据,就会有相同的开销。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2015-02-03
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多