それは、オブジェクトのアーカイブを使用して複数のオブジェクトを格納することは可能ですか?
-
23-09-2019 - |
質問
さて、それは可能で、もちろん、それは何の問題ません。私のコードでは、私は私が働くことを複数のオブジェクトを持っている、と彼らは永続的なデータにする必要があります。私は、オブジェクトのエンコードを使用して、データファイルに格納したことをすることができません。以下のような:
-(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];
私は私が保存されているオブジェクトのすべての残りの部分が削除されている、ことを行っている後。私は何とか彼らの残りの部分を削除することを明らかに私は1つのキーだけ「のsingleplayer」を編集して思ったが、ので、今私は、混乱していますか? supossedが発生していることですか?私はアーカイバを解放するといくつかの問題があった、それがすべてでそれに影響を与えるだろう...私はそれは思いません。私が唯一の彼らの編集一つにしたいかどうかをオブジェクトと再エンコードそれら...
のすべてを取る必要がしたくないので、誰もが、この上でいくつかの洞察力を持っていますあなたの助けをありがとう!
解決
あなたはemtpyデータオブジェクトに、新しいアーカイバを作成します。あなたは、データ内のsingleplayerオブジェクトを作成していますが、同じ、新しく作成されたアーカイブに残りのデータを格納しません。
これを行うには、アーカイブを解除全体以前に格納されたアーカイブ、その後のsingleplayerオブジェクトとアーカイブを調整して、もう一度それを保存します。