存储一个数组,每次只保存一个成员?

时间:2015-02-17 13:50:42

标签: ios objective-c local-storage nsuserdefaults

我想存储一个数组,以便在启动时可用。数组中的每个项表示列表中的项,在保存到数组中之前将其转换为JSON格式。

我一直把它保存到NSUserDefaults,但是每次我想要更改其中的单个项目时,我都不想将整个数组保存到NSUserDefaults。理想情况下,我只是在数组内部更改该值,而不需要更改其他值。而且我还需要在数组中添加和删除项目,而且,我不想保存整个数组只是为了做到这一点。

有更有效的方法吗?

现在,我一直在用自己的标识符保存到NSUserDefaults的每个项目以及每个标识符的正确顺序的数组中解决这个问题。然而,这已成为一个复杂的解决方案,存在问题。

2 个答案:

答案 0 :(得分:2)

为什么不使用NSArray而不是使用NSDictionary来保存您的数据,而不是使用JSON,这样您就可以更轻松地获取数据并更轻松地转换为{{1 }}。

所以我做了类似的事情:

// Few constants for keys
NSString const *itemsListKey = @"FruitItems";
NSString const *applesKey = @"Apples";
NSString const *bananasKey = @"Bananas";

创建新词典并将其添加到NSUserDefaults

NSMutableDictionary *items = [[NSMutableDictionary alloc] init];
[items setObject:5 forKey:applesKey];
[items setObject:2 forKey:bananasKey];

[[NSUserDefaults standardUserDefaults] setObject:items forKey:itemsListKey];
[[NSUserDefaults standardUserDefaults] synchronize];

检索现有词典并修改NSUserDefaults

中的当前词典
// The dictionary retrieved isn't mutable so we need to get a mutable copy of it.
NSMutableDictionary *itemsRetrieved = [[[NSUserDefaults standardDefaults] dictionaryForKey:itemsListKey] mutableCopy];
// Lets update our Apples value
[itemsRetrieved setObject:9 forKey:applesKey];

// Set the dictionary back into NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:items forKey:itemsListKey];
[[NSUserDefaults standardUserDefaults] synchronize];

您会注意到两种不同方法之间没有太大差异,因此您可以将其整合到一个方法中,如下所示。

// Obviously this constant being the key to your dictionary
NSString const *itemsListKey = @"itemsList"; 

- (void)updateItemsForKey:(NSString *)key withValue:(NSInteger)value
{
    NSMutableDictionary *items [[NSMutableDictionary alloc] init];
    if ([[NSUserDefaults standardDefaults] dictionaryForKey:itemsListKey] != nil) {
        // If the key already exist in NSUserDefaults reallocate it 
        // to the one that exists.
        items = [[[NSUserDefaults standardDefaults] dictionaryForKey:itemsListKey] mutableCopy];
    }

    [itemsRetrieved setObject:value forKey:key]; 

    // Assign the dictionary back into NSUserDefaults
    [[NSUserDefaults standardUserDefaults] setObject:items forKey:itemsListKey];
    [[NSUserDefaults standardUserDefaults] synchronize];
} 

修改 - 根据他们希望订购的评论。

如果NSDictionary处于排序顺序,我们真的不在乎。如果我们想要按排序顺序排列对象,我们可以在进行allKeys调用时将字典的键排序为排序顺序。

NSArray *orderedKeys =  [[items allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
}];

上面的代码将为您提供数字排序的数组,然后循环遍历orderedKeys数组,以按您想要的顺序获取所需的值:

for (NSString *key in orderedKeys) {
    id objectFromDict = [items objectForKey:key];
    // Do whatever you want with that object.
}

答案 1 :(得分:0)

保存整个阵列有什么问题?如果要编辑一个项目,请从NSUserDefaults中获取数组(创建可变副本),更改相应项目,然后保存数组。