0

我的代码在这里:

-(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(即:“buttons”)保存一个文件一次,它会起作用。但是如果我想使用指定的 fileKey(即:“clocks”)将另一个文件保存到磁盘,它会覆盖“buttons”使用“时钟”,因此“无法再次访问按钮..

如何解决这个困境?我相信这应该是我“saveDataToDisk”(存档)的方式,我应该将一堆文件写入磁盘,而不是用最新的文件替换每个文件。

4

2 回答 2

1

你总是写到“~/Documents/data.bin”——你的pathForDataFile方法总是返回那个路径。如果要保存到不同的文件,则应写入不同的文件。

于 2011-12-14T00:33:59.517 回答
1

除非我读错了你的代码,否则你总是使用相同的路径来保存文件。这就是它被覆盖的原因。

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

每次保存文件都在 /path/you/retrieve/data.bin

您需要更改文件名或保存它的目录。如果要保留相同的文件名,则每次保存时都创建一个新目录,并在该目录上加上时间戳或描述您的身份保存。

于 2011-12-14T00:34:39.080 回答