2011-06-05 65 views
0

**的NSKeyedArchiver的.plist附加问题

  1. 我是从一种形式将数据传输到一个数组,并尝试写数组使用的NSKeyedArchiver一个的.plist文件。
  2. 写作是成功的,但是每当我运行该脚本,它将覆盖以前的数据。
  3. 如何将新数据附加到.plist文件而不是覆盖?

**

@implementation Player 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

- (IBAction)savePlayer:(id)sender { 
    NSString *path = @"/Users/username/fm.plist"; 
    NSString *pl= [teamPlayer stringValue]; 
    NSString *name = [namePlayer stringValue]; 
    NSString *age = [agePlayer stringValue]; 
    NSString *position= [positionPlayer stringValue]; 
    Player *player = [[Player alloc] init]; 

    array = [[NSMutableArray alloc] initWithObjects:pl, 
            name, age, position, nil]; 

    [NSKeyedArchiver archiveRootObject:array toFile:path]; 
    NSString *ns = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
    NSLog(@"test: %@" , ns); 
    [array release]; 
} 

-

- (void) encodeWithCoder: (NSCoder *) coder{ 
    [coder encodeObject:array forKey:@"someArray"]; 
} 

- (void) decodeWithCoder: (NSCoder *) coder{ 
    [coder decodeObjectForKey:@"someArray"]; 
    return self; 
} 
+0

我忘了加我收到错误:无法识别的选择发送到实例 – 2011-06-05 12:59:51

回答

1

首先,似乎最后两个方法都不是相关的,你是不是编码对象为准这些方法属于。再次,协议包括encodeWithCoder:initWithCoder:方法。 NSCoding协议中没有decodeWithCoder:方法。

其次,要创建一个使用几个元素初始化的新NSMutableArray对象,并因此将覆盖现有归档它到一个文件。您将需要通过取消存档文件来获取现有阵列,创建可变副本并添加值。所以,代码将是这样的,

NSArray *existingValues = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
NSArray *newValues = [existingValues copy]; 
[newValues addObjectsFromArray:[NSArray arrayWithObjects:pl, name, age, position, nil]]; 
[NSKeyedArchiver archiveRootObject:newValues toFile:path]; 
[newValues release]; 
+0

感谢您的回答。但是这种方法看起来效率不高。每次用户从表单输入数据时,都需要复制并写入总体对象。 – 2011-06-05 14:08:06

+0

如果你正在考虑存储表单数据,你应该看看核心数据。这对于这样的事情来说绝对是低效的。 – 2011-06-05 14:33:45

+0

如果你经常这样做,你需要担心效率,你应该在内存中保留一个可变的结构版本,并且每次修改和写入。或者您应该使用不同的存储系统,如Core Data。你不能附加到磁盘上的plist;该格式不允许它。 – smorgan 2011-06-05 14:42:32