1

プログラムの実行時にいつでも取得できるように、変更された NSDate (開始日の午前 8 時) をデータベースに保存しようとしています。オブジェクトアーカイブを使用しています。正しいコードを持っていると思っていましたが、保存できないようです。エラーは表示されず、コードに入力した出力のみが表示されます。日付と時刻は NSLog の出力として表示されるため、正しいことがわかります。これが私のコードです:

__dataArea = [NSMutableData data];
__unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:__dataArea];
__archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:__dataArea];

__iDates = [[BCimportantDates alloc] initWithCoder:[NSKeyedUnarchiver unarchiveObjectWithFile: @"firstDate.arch"]];

if ((__iDates.firstDate == nil)){ 

    NSDate *date = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date];
    NSLog(@"the date %@",date);
    [components setHour: 3];
    [components setMinute: 00];
    [components setSecond: 00];
    __newDate = [gregorian dateFromComponents: components];
    [__iDates setFirstDate: __newDate];
    NSLog(@"%@",__iDates.firstDate);
    [__iDates encodeWithCoder: __archiver];
    [__archiver finishEncoding];
    if ([__dataArea writeToFile:@"firstDate.arch" atomically:YES] == NO){
        NSLog(@"archiving failed. ");
    }
}

BCimportantDates.m 内のエンコーダー関数とデコーダー関数の実装は次のとおりです。

- (void) encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject: __firstDate forKey: kfirstDateKey];
}

- (id) initWithCoder: (NSCoder *) decoder{
    if (self = [super init]) {
    self.firstDate = [decoder decodeObjectForKey:kfirstDateKey];
    }
    return self;
}

__iDates がエンコードされる場所、アーカイバが終了する場所、および機能するかどうかを確認する場所でブレークポイントを使用してみました。デバッグはそれほど明確ではありませんでしたが、正直なところ、この種のエラーを見つけるには何を探すべきかわかりません. この問題を解決するために他に何ができますか? 考えられる解決策は何ですか?

4

1 に答える 1

0

writeToFile:ここでの問題は、書き込み先のパスを指定していないことだと思います。

これを試して:

NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"firstDate.arch"];

if ([__dataArea writeToFile:path atomically:YES] == NO){
    NSLog(@"archiving failed. ");
}

ファイルを一時ディレクトリに書き込む場合は、ブレークポイントを設定するか、パス変数をログに記録して、この場所がどこにあるかを確認できます。NSTemporaryDirectory()は単なる例です。このフォルダは一時的なものであり、システムによっていつでも削除できるためです。これは、より適切なパスを提供する可能性のあるNSFileManagerのカテゴリです。

于 2012-09-27T20:53:59.467 に答える