NSDictionary 中的 NSArray 存储在 NSUserDefaults 中
NSArray in NSDictionary stored in NSUserDefaults
我只是想在 NSUserdefaults 中保存数组字典的字典,但没有成功。这是我的代码:
+ (BOOL) userHasAlreadyLoad:(NSNumber *)territoryId year:(NSInteger)year month:(NSInteger)month
{
NSMutableDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:USER_SETTING_MONTHS_LOADED];
NSMutableDictionary *dictOfTerritory = dict[[territoryId stringValue]];
if (dictOfTerritory == nil)
return NO;
NSMutableArray *yearData = dictOfTerritory[[@(year) stringValue]];
if (yearData == nil)
return NO;
if ([yearData containsObject:@(month)])
return YES;
return NO;
}
+ (void) setUserLoad:(NSNumber *)territoryId year:(NSInteger)year month:(NSInteger)month
{
NSMutableDictionary *dict = [[[NSUserDefaults standardUserDefaults] objectForKey:USER_SETTING_MONTHS_LOADED] mutableCopy];
NSMutableDictionary *dictOfTerritory = [dict[[territoryId stringValue]] mutableCopy];
if (dictOfTerritory == nil)
{
dictOfTerritory = [NSMutableDictionary dictionary];
dict[[territoryId stringValue]] = dictOfTerritory;
}
NSMutableArray *yearData = [dictOfTerritory[[@(year) stringValue]] mutableCopy];
if (yearData == nil)
{
yearData = [NSMutableArray array];
}
if (![yearData containsObject:@(month)])
{
[yearData addObject:@(month)];
}
dictOfTerritory[[@(year) stringValue]] = yearData;
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:USER_SETTING_MONTHS_LOADED];
[[NSUserDefaults standardUserDefaults] synchronize];
}
当我第一次 运行 应用程序时,它会正确保存数据,这意味着 yearData
将包含一个月,但在向该数组添加更多数据后我找不到它们调用 userHasAlreadyLoad;对于相同的 territoryId 和 Year,我只能看到一个月,这是我添加的第一个月。我在这里错过了什么吗?
当您得到 dictOfTerritory
时,您可以调用 mutableCopy
,它会为您提供该词典的副本。而且您只将值保存到复制的字典中,而不是在 dict
主字典中具有引用的字典。
在保存字典的地方尝试以下代码。
dictOfTerritory[[@(year) stringValue]] = yearData;
[dict setObject:dictOfTerritory forKey:[territoryId stringValue]];
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:USER_SETTING_MONTHS_LOADED];
我只是想在 NSUserdefaults 中保存数组字典的字典,但没有成功。这是我的代码:
+ (BOOL) userHasAlreadyLoad:(NSNumber *)territoryId year:(NSInteger)year month:(NSInteger)month
{
NSMutableDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:USER_SETTING_MONTHS_LOADED];
NSMutableDictionary *dictOfTerritory = dict[[territoryId stringValue]];
if (dictOfTerritory == nil)
return NO;
NSMutableArray *yearData = dictOfTerritory[[@(year) stringValue]];
if (yearData == nil)
return NO;
if ([yearData containsObject:@(month)])
return YES;
return NO;
}
+ (void) setUserLoad:(NSNumber *)territoryId year:(NSInteger)year month:(NSInteger)month
{
NSMutableDictionary *dict = [[[NSUserDefaults standardUserDefaults] objectForKey:USER_SETTING_MONTHS_LOADED] mutableCopy];
NSMutableDictionary *dictOfTerritory = [dict[[territoryId stringValue]] mutableCopy];
if (dictOfTerritory == nil)
{
dictOfTerritory = [NSMutableDictionary dictionary];
dict[[territoryId stringValue]] = dictOfTerritory;
}
NSMutableArray *yearData = [dictOfTerritory[[@(year) stringValue]] mutableCopy];
if (yearData == nil)
{
yearData = [NSMutableArray array];
}
if (![yearData containsObject:@(month)])
{
[yearData addObject:@(month)];
}
dictOfTerritory[[@(year) stringValue]] = yearData;
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:USER_SETTING_MONTHS_LOADED];
[[NSUserDefaults standardUserDefaults] synchronize];
}
当我第一次 运行 应用程序时,它会正确保存数据,这意味着 yearData
将包含一个月,但在向该数组添加更多数据后我找不到它们调用 userHasAlreadyLoad;对于相同的 territoryId 和 Year,我只能看到一个月,这是我添加的第一个月。我在这里错过了什么吗?
当您得到 dictOfTerritory
时,您可以调用 mutableCopy
,它会为您提供该词典的副本。而且您只将值保存到复制的字典中,而不是在 dict
主字典中具有引用的字典。
在保存字典的地方尝试以下代码。
dictOfTerritory[[@(year) stringValue]] = yearData;
[dict setObject:dictOfTerritory forKey:[territoryId stringValue]];
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:USER_SETTING_MONTHS_LOADED];