2012-02-15 88 views
1

您如何比较2 NSMutableArray添加到NSUserDefaults - 初学者

不同的人可能会说这是一个重复的问题,但在查看大多数SO问题后,我还没有找到解决我的问题的方法。

有一个Person对象,它具有字段Name, Age, Rank

我有一个MutableArray将从NSUserDefaults保存数据。那么它会看到NSMutableArray是否包含该特定对象。如果没有,它会将其添加到NSUserDefaults

当我将人物添加到NSUserDefaults(我正在通过数组添加人物对象,请参阅代码)时,会出现一些问题。

当我打印[data count]它总是0。所以它可能没有正确添加到NSUserDefaults。或者我可能会犯一些错误。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

      if (userDefaults) { 

       NSArray *arr= [userDefaults objectForKey:@"person"]; 

       data = [NSMutableArray arrayWithArray:arr]; 

NSLog (@"%i ", [data count]); 

       if (! [data containsObject:self.person]) { 

        [data addObject:self.person]; 

        NSArray *personarr= [NSArray arrayWithArray:data]; 

        [userDefaults setObject:personarr forKey:@"person"]; 

        [userDefaults synchronize]; 
+0

self.person是如何定义的? – ader 2012-02-15 17:16:44

+0

person对象在.h中定义并合成。它包含一个人的姓名,年龄和等级。我需要它被添加到NSUserDefaults。下面讨论的 – shajem 2012-02-15 17:25:39

+0

使名称,年龄和等级NSStrings和NSNumbers。 – ader 2012-02-15 17:37:50

回答

0

如果你从NSUserDefaults得到一个数组,它将永远不会和任何当前对象(比如self.person)一样是指针,所以这不会起作用。比较对象与==比较它们的内存地址。

如果您想比较它们,请使用它们的内容。 (例如[[person objectForKey: @"Name"] isEqualToString: [person2 objectForKey: @"Name"]])。所以你应该循环做检查,如果新人的名字已经存在。

另外,arrayWithArray不是NSMutableArray的初始值设定项。 所以,如果它应该是可变的,那样做:

NSArray *arr= [userDefaults objectForKey:@"person"]; 
data = [[arr mutableCopy] autorelease]; 

如果你的数始终为零,检查实际的数组内容,看看里面什么。 例如像这样:

NSArray *arr= [userDefaults objectForKey:@"person"]; 
CFShow(arr); 
1

您可以实现您的Person类方法,它的数据导出到一个字典,和init方法将自己从相同的字典重建。正如Amorya指出的那样,你不能将任何任意对象粘贴到NSUserDefaults中。

+0

我编辑了我的问题。我不是将一个人对象添加到NSUserDefaults,而是一个数组 – shajem 2012-02-15 17:26:37

+0

但是您的“数据”数组仍然包含一个Person对象。这不起作用。你必须转换为有效的对象,NSString,NSArray等,不只是将对象埋入数组中。 – picciano 2012-02-15 17:33:06

+0

你能举个例子吗? – shajem 2012-02-15 17:34:41

2

如果self.personPerson类的实例,那么即使在数组中也不能将其放入用户默认值中。从NSUserDefaults文档:

值参数可以只是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。对于NSArray和NSDictionary对象,其内容必须是属性列表对象。

他们建议this为进一步阅读,其中列出算属性列表对象的类型。

+0

根据代码,我不添加人物。这是我添加的一个数组。 – shajem 2012-02-15 17:22:41

+0

看起来好像你的数组包含'Person'对象。这是不允许的。 – edc1591 2012-02-15 17:28:41

+1

是的,但你的数组_contains_ Person对象。它一直是属性列表类型。 – jrturton 2012-02-15 17:29:55

0

您正在将您的Person对象保存在NSArray中,然后将NSArray保存到NSUserDefaults中,但这还不够。在将它保存到NSUserDefaults之前,必须序列化Person对象。

本文将解释这更好,我想:Storing custom objects in an NSMutableArray in NSUserDefaults

尝试的NSLog(@ “%@” self.person);在你的if语句之前,因为我怀疑它可能是零。

我希望对你有帮助。