2

私は現在、NSKeyedArchiverで使用されるカスタムクラスを使用するこのブログを使用しています。すべてが正しいように見えますが、「学生」のさまざまなインスタンスを取得する方法を考えています。

http://keeptheseinmind.blogspot.com/2011/10/nskeyedarchiver-tutorial.html

このチュートリアルでは、アプリケーションが終了するたびに、カスタムクラス「students」の新しいインスタンスが作成されます。そして、NSKeyedArchiver内にはこれらの「学生」インスタンスが多数あると想定しましたが、アクセスできるのはそのうちの1つだけです。

ディスクに保存する

- (void)saveDataToDisk {
    NSString *path = @"~/Documents/data";
    path = [path stringByExpandingTildeInPath];

    NSMutableDictionary *rootObject;
    rootObject = [NSMutableDictionary dictionary];

    [rootObject setValue:student forKey:@"student"];

    [NSKeyedArchiver archiveRootObject:rootObject toFile:path];
}

ディスクからの読み込み

- (void)loadDataFromDisk {
    NSString *path = @"~/Documents/data";
    path = [path stringByExpandingTildeInPath];

    NSMutableDictionary *rootObject;
    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    if ([rootObject valueForKey:@"student"]) {
        student = [rootObject valueForKey:@"student"];
    }
}

編集:

私は間違っています。アプリケーションが終了するたびに、インスタンスが互いに上書きし合っています。面白い...

ただし、私の目標は、1つまたは複数のNSKeyedArchiver内に「学生」のインスタンスを多数作成することです。任意のアイデアをいただければ幸いです。

4

1 に答える 1

2

NSKeyedArchiverオブジェクトをディスクに保存(シリアル化)する方法と考えることができます。あなたの場合、そのオブジェクトは、NSDictionaryキーが1つだけあるオブジェクトですstudent(データ構造を表示するためにJSON風の表記法を使用しています。意図が明確であることを願っています)。

"student" : { "studentId" : 25,
              "studentName" : "John Smith"
            }

お気づきのように、電話をかけるたびに、saveDataToDiskその1つの「学生」キーが上書きされます。複数の生徒を救うために、いくつかの方法があります。選択は、データをどのように読み戻すかによって異なります。

1つのオプションは、NSDictionary:の代わりに配列を格納することです。

"student" : [ { "studentId: 25, "studentName" : "John Smith" },
              { "studentId: 26, "studentName" : "Jane Doe" } ]

このアプローチを採用する場合は、それが1人の学生にsaveDataToDiskアクセスできることを確認し、代わりにNSArrayその配列を次のアドレスに渡す必要があります。rootObject setValue:

[rootObject setValue:students forKey:@"students"];

または、辞書にキーを追加して、それぞれが学生を表すようにすることもできます。

"student25" : { "studentId: 25, "studentName" : "John Smith" },
"student26" : { "studentId: 26, "studentName" : "Jane Doe" }

この場合も、保存関数が生徒の配列にアクセスできることを確認する必要がありますが、今回はその配列をループし、作成した独自のキーを使用して各生徒をrootDictionaryに追加します(例)「student」をstudentIdと連結します。

于 2013-02-27T08:45:20.087 に答える