0

我将用户信息保存在 NSMutableDictionary 中,键为“用户名”,然后将此字典保存在另一个 NSMutableDictionary 中,键为“名称”,然后将字典保存在 NSMutableArray 中。但问题是,每当我用不同的用户名保存另一个用户时,它都会覆盖 NSMutableArray 中的值。下面是我正在使用的代码

-(void) saveUserData:(NSString *)username 

{ NSLog(@"\nsaveDataBarButtonTapped \n");

NSLog(@"the count is %d",[[[ArraysManager sharedInstance] getTotalUserArray] count]);

NSLog(@"ArraysManager description is  %@ ",[[[ArraysManager sharedInstance] getTotalUserArray] description]);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString *userArrayFilePath = [[NSString alloc] initWithString:[directory stringByAppendingPathComponent:@"userData"]];

if (username.length != 0)
{
    [dataDictionary setObject:[NSString stringWithFormat:@"%@",username] forKey:@"username"];
    [dataDictionary setObject:[NSString stringWithFormat:@"%lf",totalValue] forKey:@"totalValue"];
    [dataDictionary setObject:[NSString stringWithFormat:@"%lf",totalPayable]  forKey:@"totalPayable"];

    [userDictionary setObject:dataDictionary  forKey:@"userDictionary"];

    [[[ArraysManager sharedInstance] getTotalUserArray] addObject:userDictionary];
    [[[ArraysManager sharedInstance] getTotalUserArray] writeToFile:userArrayFilePath atomically:NO];

    [dataDictionary removeAllObjects];
    [userDictionary removeAllObjects];

    NSLog(@"ArraysManager description is  %@ ",[[[ArraysManager sharedInstance] getTotalUserArray] description]);
}

else 
{
    UIAlertView *noNameAlertView = [[UIAlertView alloc] initWithTitle:@"No Name Found" 
                                                              message:@"Please Enter the User Name" 
                                                             delegate:self 
                                                    cancelButtonTitle:@"Ok" 
                                                    otherButtonTitles:nil, nil];
    [noNameAlertView show];
    [noNameAlertView release];
}

}

4

4 回答 4

1

我认为你应该写:

 [userDictionary setObject:dataDictionary  forKey:username];

(其实我不明白你为什么这样做;

[[[ArraysManager sharedInstance] getTotalUserArray] addObject:userDictionary];

似乎您每次都在添加相同的字典。)

于 2012-06-29T10:08:07.267 回答
0

我认为您在两种情况下都使用相同的密钥保存,因此它访问相同的数组,您需要更改不同字典的密钥。

编辑:

[userDictionary setObject:dataDictionary  forKey:[NSString stringWithFormat:@"name%d,nameCount"]];
于 2012-06-29T10:01:58.517 回答
0

您正在addObject使用相同的NSMutableDictionary对象。

之后你检查过count房产addObject吗?

为了快速修复,只需copy将字典添加到数组中即可。

[[[ArraysManager sharedInstance] getTotalUserArray] addObject:[[userDictionary copy] autorelease];

autorelease对于非 ARC 配置)

于 2012-06-29T11:42:45.213 回答
0
[dataDictionary removeAllObjects];
[userDictionary removeAllObjects];

我认为上述两个对象都是成员变量,您正在重用这些成员变量来将数据添加到您的数组中。从字典中删除对象不会创建新的字典对象,而是在相同的内存位置进行更新。您的数组将有多个字典和子字典,但它们都有 2 个对象,它们都位于相同的内存位置。

代替这些成员变量,将它们用作局部变量。在此方法中初始化它们并将它们添加到数组中。稍后在此方法结束之前释放它们。

希望能帮助到你

于 2012-06-29T11:15:03.413 回答