我正在为我的应用发送更新,要求更新用户数据库。我将数据存储在属性列表中。基本上,数组中的每个点都是NSMutableDictionaries,我需要添加键,替换键等。
我尝试了以下方法,但它会生成一个NSException,
for (NSMutableDictionary *dict in myArray) {
if ([dict objectForKey:@"someKey"] == nil) {
//Extract the value of the old key and remove the old key
int oldValue = [[dict objectForKey:@"key1"] intValue];
[dict removeObjectForKey:@"key1"];
[dict setValue:[NSString stringWithFormat:@"%d pts", oldValue] forKey:@"newKey"];
//Add new keys to dictionnary
[dict setValue:@"some value" forKey:@"key2"];
[dict setValue:@"some value" forKey:@"key3"];
[dict setValue:@"some value" forKey:@"key4"];
[self.myArray replaceObjectAtIndex:index withObject:dict];
}
如何以上述方式更新数据?
答案 0 :(得分:1)
问题是你不能通过快速枚举来修改你正在迭代的数组。
代码片段根本不需要replaceObjectAtIndex:withObject:
调用,因为您将对象替换为完全相同的对象!因此,如果删除该行,一切都应该有效。
通常,如果使用带索引的普通旧for循环,即
,则可以避免类似的问题for (int i = 0; i < [array count]; i++) {
id obj = [array objectAtIndex:i];
// ...
}
因为这不会搞乱快速枚举。
答案 1 :(得分:1)
创建数组的副本并枚举副本。通过这种方式,您可以安全地修改原始文件:
for (id obj in [NSArray arrayWithArray:entries]) {
[entries removeObject:obj];
}
不要使用:
for (int i = 0; i < [array count]; i++) {
id obj = [array objectAtIndex:i];
[array removeObject:obj];
}
这样做是因为删除后数组索引会被偏移!
答案 2 :(得分:0)
首先,确保myArray
是NSMutableArray。如果是这样,如果您调试类似_NSArrayI unrecognized selector sent to instance
的代码,您可能会看到一些错误_NSArrayI意味着它是一个不可变数组。这非常烦人,但尝试通过这样做进行测试。然后,您可以使用mutableArray替换myArray。
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self.myArray];
for (NSMutableDictionary *dict in mutableArray) {
if ([dict objectForKey:@"someKey"] == nil) {
//Extract the value of the old key and remove the old key
int oldValue = [[dict objectForKey:@"key1"] intValue];
[dict removeObjectForKey:@"key1"];
[dict setValue:[NSString stringWithFormat:@"%d pts", oldValue] forKey:@"newKey"];
//Add new keys to dictionnary
[dict setValue:@"some value" forKey:@"key2"];
[dict setValue:@"some value" forKey:@"key3"];
[dict setValue:@"some value" forKey:@"key4"];
[mutableArray replaceObjectAtIndex:index withObject:dict];
}
}