Цель-C: Как заставить это сохранить два файла вместо одного для NSCoding? - PullRequest
0 голосов
/ 14 декабря 2011

Мой код здесь:

-(void)loadDataFromDisk
{
    [dict release];
    NSMutableData* data = [NSMutableData dataWithContentsOfFile:[self pathForDataFile]];
    NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    dict = [[unarchiver decodeObjectForKey:fileKey] retain];
    [unarchiver finishDecoding];
    [unarchiver release];

    if(dict == NULL)
    {
    NSLog(@"First time in.");
    dict = [[NSMutableDictionary alloc] init];
    }
}

-(void)saveDataToDisk
{
    NSMutableData* data = [NSMutableData data];
    NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver setOutputFormat:NSPropertyListBinaryFormat_v1_0];

    // EncodeObject will automatically encode every primitive inside 'dictionaryToSave', 
    // As for objects, the object class must conform to NSCoding Protocol, else an error will occur.
    [archiver encodeObject:dict forKey:fileKey];
    [archiver finishEncoding];
    [archiver release];

    [data writeToFile:[self pathForDataFile] atomically:YES];    
}

-(NSString*)pathForDataFile
{
     NSArray* documentDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

    NSString* path = nil;
    if (documentDir) 
    {
        path = [documentDir objectAtIndex:0];    
    }
    else
    {
        NSLog(@"error in [PersistentHandler pathForDataFile]");
    }
    // Returns 'directory'/data.bin to method(saveDatatoDisk/loadDataFromDisk)
    return [NSString stringWithFormat:@"%@/%@", path, @"data.bin"];
}

Это работает, если я сохраняю файл один раз с указанным fileKey (то есть: "кнопки") .. НО тогда, если я хочу сохранить другой файл на диск суказанный fileKey (то есть: «часы»), он будет перезаписывать «кнопки» с «часами», поэтому «кнопки не могут быть доступны снова ..

Как исправить эту дилемму? Я полагаю, что это должно быть, как я«saveDataToDisk» (архив), я должен записывать кучу файлов на диск, а не заменять каждый на самый последний.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Если я неправильно читаю ваш код, вы всегда используете один и тот же путь для сохранения файла.Вот почему он перезаписывается.

return [NSString stringWithFormat:@"%@/%@", path, @"data.bin"];

Каждый раз, когда вы сохраняете файл по адресу /path/you/retrieve/data.bin

Вам необходимо изменить имя файла иликаталог, в котором он сохранен. Если вы хотите сохранить одно и то же имя файла, создайте новый каталог каждый раз, когда сохраняете, и просто пометьте каталог меткой времени или описанием того, что вы сохраняете.

1 голос
/ 14 декабря 2011

Вы всегда пишете в "~ / Documents / data.bin" - ваш метод pathForDataFile всегда возвращает этот путь.Вы должны писать в разные файлы, если хотите сохранить в разные файлы.

...