6

我正在编写一个 Cookbook 应用程序,但我找不到任何关于如何保存我创建的类(Recipe 类)的数据的任何信息。我见过的唯一方法是可能将此类的内容作为一个整体保存,而无需通过为我的 Recipe 类创建此方法来单独保存每个对象的类的每个元素:

-(void) writeToFile:(NSString *)file atomically:(BOOL)atomic{

}

但我完全不知道我将如何实现它以使用此方法将此对象保存到文件中。一些属性是:

NSString* name;
UIImage* recipePicture;
NSDate* dateAdded;
NSMutableArray* ingredients; //The contents are all NSStrings.

有谁知道如何保存 Recipe 类的对象?它一直让我发疯,无法弄清楚。任何帮助将不胜感激。我已经有一个名为“RecipeData.plist”的.plist。我是否只需要将每个属性写入 plist 并在运行时使用这些属性初始化一个新的配方对象?

4

2 回答 2

5

采纳:

@interface Recipe : NSObject<NSCoding>

实施:

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:name_ forKey:@"name"];
    [coder encodeObject:recipePicture_ forKey:@"recipePicture"];
    [coder encodeObject:dateAdded_ forKey:@"dateAdded"];
    [coder encodeObject:ingredients_ forKey:@"ingredients"];

}

// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self!=NULL)
    {
       name_ = [coder decodeObjectForKey:@"name"];
       recipePicture_ = [coder decodeObjectForKey:@"recipePicture"];
       dateAdded_ = [coder decodeObjectForKey:@"dateAdded"];
       ingredients_ = [coder decodeObjectForKey:@"ingredients"];   
    }
    return self;
}

现在在你的保存中:

- (void) save:(NSString*)path recipe:(Recipe*)recipe
{
    NSMutableData* data=[[NSMutableData alloc] init];
    if (data)
    {
        NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        if (archiver)
        {
            [archiver encodeInt:1 forKey:@"Version"];
            [archiver encodeObject:recipe forKey:@"Recipe"];
            [archiver finishEncoding];

            [data writeToFile:path atomically:YES];

        }
     }
 }

在负载中:

- (Recipe*) load:(NSString*)path
{
    Recipe* ret=NULL;
    NSData* data=[NSData dataWithContentsOfFile:path];
    if (data)
    {
        NSKeyedUnarchiver* unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        if (unarchiver)
        {
            int version=[unarchiver decodeIntForKey:@"Version"];
            if (version==1)
            {
                 ret=(Recipe*)[unarchiver decodeObjectForKey:@"Recipe"];
            }
            [unarchiver finishDecoding];
        }
    }
    return ret;
}
于 2012-11-10T23:21:05.360 回答
2

一种选择(除了编码/解码)是将类的每个属性存储在字典中。然后将字典写入文件。诀窍是确保您放入字典中的每个对象都允许在 plist 中。在您显示的四个属性中,除了 UIImage 之外的所有属性都可以按原样存储。

-(BOOL)writeToFile:(NSString *)file atomically:(BOOL)atomic{
    NSMutableDictionary *data = [NSMutableDictionary dictionary];

    [data setObject:name forKey:@"name"];
    [data setObject:dateAdded forKey@"dataAdded"];

    NSDate *imageData = UIImagePNGRepresentation(recipePicture);
    [data setObject:imageData forKey:@"recipePicture"];

    // add the rest

    return [data writeToFile:file atomically:YES];
}

我更新了这个以返回一个 BOOL。如果失败,则意味着以下两种情况之一:

  1. 文件不合适
  2. 您试图在字典中保存一个非 plist 友好对象

您需要添加代码以避免尝试添加nil对象(如果有的话)。重要的是要确保所有键都是字符串,并且只存储 plist 友好的对象(NSString、NSNumber、NSDate、NSValue、NSData、NSArray 和 NSDictionary)。

于 2012-11-10T23:36:32.353 回答