0

ユーザー情報をキー「username」でNSMutableDictionaryに保存してから、このディクショナリをキー「name」で別の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

あなたはaddObject同じNSMutableDictionaryオブジェクトでやっています。

count後で物件を確認しましたaddObjectか?

すばやく修正するにはcopy、辞書を配列に追加する前に辞書を追加します。

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

autorelease非ARC構成の場合)

于 2012-06-29T11:42:45.213 に答える
0

どちらの場合も同じキーで保存すると思うので、同じ配列にアクセスします。異なる辞書のキーを変更する必要があります。

編集:

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

上記のオブジェクトは両方ともメンバー変数であり、それらのメンバー変数を再利用して配列にデータを追加していると思います。ディクショナリからオブジェクトを削除しても、新しいディクショナリ オブジェクトは作成されませんが、同じメモリ ロケーションで更新されます。配列には複数の辞書とサブ辞書がありますが、すべて同じメモリ位置にこれらの 2 つのオブジェクトがあります。

これらのメンバー変数の代わりに、これらをローカル変数として使用します。このメソッドでそれらを初期化し、配列に追加します。後でこのメソッドが終了する前にそれらを解放します。

それが役に立てば幸い

于 2012-06-29T11:15:03.413 に答える