类数据类型的持久数据

时间:2011-03-17 00:15:30

标签: ios iphone cocoa-touch archive persistent

我有一个我的类实例,它基本上是来自我自己的另一个类的可变对象数组。我需要将它存储在持久数据中但我遇到了麻烦,我尝试使用方法

进行归档
-(void)archiveFavorites {
    Singleton *singleton = [Singleton sharedSingleton];
    NSLog(@"archiving");
    GameDatabase *favoritesToArchive = singleton.favorites;
    [NSKeyedArchiver archiveRootObject:favoritesToArchive toFile:[self archivePath]];
}

-(NSString *)archivePath {
    NSString *docDir = 
    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    return [docDir stringByAppendingPathComponent: @"Favorites.dat"];
}

在我的视图控制器中。然后我打电话给

[viewController archiveFavorites];

在我的应用代理中“app location确实输入了背景”

基本上我正在尝试在归档中存储我自己的类(GameDatabase)的实例。归档时,我被抛出异常:

编辑:好的,这就是我现在要在我的两个课程中实现的内容: GameDatabase.m

- (void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:games forKey:@"Games"];
}

- (id)initWithCoder:(NSCoder *)decoder{
    if(self = [super init])
    {
        games = [decoder decodeObjectForKey:@"Games"];
    }
    return self;
}

GameRecord.m

- (id)initWithCoder:(NSCoder *)decoder {

    if (self = [super init]) {
        self.name = [decoder decodeObjectForKey:@"Name"];
        self.gameRules = [decoder decodeObjectForKey:@"GameRules"];
        self.players = [decoder decodeIntForKey:@"Players"];
        self.gameType = [decoder decodeIntForKey:@"GameType"];
        self.drinkType = [decoder decodeIntForKey:@"DrinkType"];
    }
    return self;

}

- (void)encodeWithCoder:(NSCoder *)encoder {

    [encoder encodeObject:self.name forKey:@"Name"];
    [encoder encodeObject:self.gameRules forKey:@"GameRules"];
    [encoder encodeInt:self.players forKey:@"Players"];
    [encoder encodeInt:self.gameType forKey:@"GameType"];
    [encoder encodeInt:self.drinkType forKey:@"DrinkType"];

}

1 个答案:

答案 0 :(得分:0)

你是在正确的道路上,但你需要让你的GameDatabase类实现NSCoding协议。只需添加两种方法described in the docs即可。