如何在数组中保存自定义对象并将其存储在NSUserDefaults - iPhone中

时间:2013-12-17 06:48:35

标签: ios objective-c arrays nsuserdefaults

我在按钮操作方法后获取自定义类对象。现在我需要在NSMutableArray中存储多个自定义对象,然后将此数组存储在NSUserDefaults中。

这是我的代码:

-(IBAction)onClickSubmitLater:(id)sender
{
    //Saving store in user defaults for later upload data.

    NSMutableArray *arrayStoreList = [[NSMutableArray alloc] init];
    arrayStoreList = [Util getArrayPreference:@"Store"];//arrayStoreList is the list of all stores.

    Store *store = [[Store alloc] init];
    store = [arrayStoreList objectAtIndex:self.selectedStoreIndex];//here i am getting particular store that i need to save in array.

    //archive
    NSData *dataStore = [NSKeyedArchiver archivedDataWithRootObject:store];
    [[NSUserDefaults standardUserDefaults] setObject:dataStore forKey:@"resultStore"];

    //unarchive
    NSData *dataResultStore = [[NSUserDefaults standardUserDefaults] objectForKey:@"resultStore"];

    Store *resultStore = (Store *)[NSKeyedUnarchiver unarchiveObjectWithData:dataResultStore];
    NSLog(@"%@", resultStore);
}

使用上面的代码,它会在Store中保存单个自定义类NSUserDefaults对象。所以我想在稍后提交ibaction后保存Store中的所有NSMutableArray对象。稍后,我将获取一系列商店,以便逐个上传服务器上的商店。

感谢。

3 个答案:

答案 0 :(得分:19)

要在用户默认值下使用自定义对象存储和检索数组,您可以使用以下方法:

-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
    [defaults setObject:data forKey:keyName];
    [defaults synchronize];
}

-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:keyName];
    NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [defaults synchronize];
    return myArray; 
}

但请确保您已实施

- (void) encodeWithCoder : (NSCoder *)encode ;
- (id) initWithCoder : (NSCoder *)decode;
数据模型类中的

方法,以避免崩溃如下:

- (void)encodeWithCoder:(NSCoder *)coder;
{
    [coder encodeObject:label forKey:@"label"];
    [coder encodeInteger:numberID forKey:@"numberID"];
}

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [super init];
    if (self != nil)
    {
        label = [[coder decodeObjectForKey:@"label"] retain];
        numberID = [[coder decodeIntegerForKey:@"numberID"] retain];
    }   
    return self;
}

答案 1 :(得分:2)

您需要通过实施NSCoding协议对其进行归档。然后你可以把它写到任何文件。

在您的模型中实施这些方法:

- (void) encodeWithCoder : (NSCoder *)encode ;
- (id) initWithCoder : (NSCoder *)decode;

正如你所说,你已经在Class中实现了这个,现在需要保存数组。

要保存和读取数组,您需要使用:;

[[NSUserDefaults standardUserDefaults] setObject:yourMutableArray forKey:@"keyForArray"];
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"keyForArray"]];

答案 2 :(得分:1)

这两种方法主要用于storeretrieve自定义对象的属性。

- (void)encodeWithCoder:(NSCoder *)encoder ;
- (id)initWithCoder:(NSCoder *)decoder;

看看@ chrissr的answer,@ Brad Larson的answer