1

私はこれまでずっとこれに固執していました、そして私はついにそれを理解しました、そして今すぐにそれは再び機能しなくなりました...

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/scoreCards.dgs",documentsDirectory];

NSMutableArray *savedArrayOfScorecards = [[NSMutableArray alloc]init];
savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
[savedArrayOfScorecards addObject:currentScoreCard];

[savedArrayOfScorecards writeToFile:filePath atomically:YES];

ファイルscoreCards.dgsは作成されていません...

私は何が間違っているのですか?

4

5 に答える 5

2

ここで問題が発生する可能性があります。

1)配列に格納している種類のデータは、ファイルにエンコードまたはアーカイブできない場合があります。また、含めたコードスニペットは、保存しようとしているデータの種類に関する適切なヒントを提供していません。配列にカスタムオブジェクト(つまり、NSString、NSNumber、NSDateなどではないもの)がある場合、それは間違いなく問題です。 StackOverflowには、この問題の解決に役立つ可能性のある質問がたくさんあります。

2)アレイのファイルパスが偽物である可能性があります。たとえば、「documentsDirectory」がnilであるか、有効であるか、書き込み可能であるかを確認していません。

3)可能ですが、可能性は低いですが、" savedArrayOfScorecards"はnil配列である可能性があります。エラーチェックを実行して、 " savedArrayOfScorecards"がインスタンス化されていること、および配列に複数のオブジェクトがあることを確認する必要があります。

于 2012-06-22T15:25:13.023 に答える
1

問題は、配列を作成しても、ファイルを読み取る前に、次の呼び出しで配列が無効になることです。

savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];

したがって、このsavedArrayOfScorecardsはnilになっているため、ファイルに書き込むための呼び出しは何もしていません。配列を別の変数にロードし、それがnilであることを確認し、ファイルから読み取られた配列がnilの場合にのみ新しい配列を作成する必要があります。このようなもの:

NSMutableArray *savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
if (!savedArrayOfScorecards) {
    savedArrayOfScorecards = [[NSMutableArray alloc]init];
}
于 2012-06-22T15:34:31.920 に答える
0

ファイルをロードするときにファイルが存在することを確認しますか?

savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];

この行は、ファイルから新しいNSMutableArrayを作成します。ファイルが存在しない場合は、nilを返します。writeToFileその後、nilに送信され、何も起こりません。

nilかどうかを確認するチェックを追加し、nilの場合は新しい配列を作成します。

NSMutableArray *savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
if(savedArrayOfScorecards == nil) savedArrayOfScorecards = [NSMutableArray array];
[savedArrayOfScorecards addObject:currentScoreCard];

[savedArrayOfScorecards writeToFile:filePath atomically:YES];
于 2012-06-22T15:28:41.230 に答える
0

NSMutableArrayは、プロパティリストに準拠した形式ではありません。plistに準拠するには、 NSArchiverを使用する必要があります。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/scoreCards.dgs",documentsDirectory];

NSMutableArray *savedArrayOfScorecards = [[NSMutableArray alloc]init];
savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath];
[savedArrayOfScorecards addObject:@"ALLLAALLAAALLA"];

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archive encodeObject:savedArrayOfScorecards forKey:@"Scorecards"];
[archive finishEncoding];

BOOL result = [data writeToFile:filePath atomically:YES];

NSLog(result ? @"YES" : @"NO");

ここに画像の説明を入力してください

于 2012-06-22T15:29:33.250 に答える
0

正解はすでにここにあり、より良い解決策を追加するだけです。

NSFileManager* fileManager = [NSFileManager defaultManager];
NSMutableArray* array;

if ([fileManager fileExistsAtPath:filePath]) {
    array = [NSMutableArray arrayWithContentsOfFile:filePath];

    NSAssert(array != nil, @"Invalid data in file.");
}
else {
    array = [[NSMutableArray] alloc] init];
}

[array addObject:currentScoreCard];
[array writeToFile:filePath atomically:YES];

于 2012-06-22T15:47:00.057 に答える