How to save custom objects in array and store it in NSUserDefaults - iPhone

16,516

Solution 1

To store and retrieve array with custom object on user defaults you can use following methods:

-(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; 
}

But make sure you have implemented

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

method in data model class to avoid crash as followings:

- (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;
}

Solution 2

You need to archive it by implementing NSCoding protocol. Then you can write it to any file.

Implement these methods in your model :

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

As you say, you have implemented this in the Class, now you need to save the array.

For saving and reading the array, you need to use :;

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

Solution 3

This two methods will mainly used to store and retrieve custom object's property.

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

Take look at @chrissr's answer, @Brad Larson's answer

Share:
16,516
Anand Gautam
Author by

Anand Gautam

Updated on June 14, 2022

Comments

  • Anand Gautam
    Anand Gautam almost 2 years

    I am getting my custom class object after button action method. Now I need to store multiple custom objects in NSMutableArray and then store this array in NSUserDefaults.

    Here is my code :

    -(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);
    }
    

    Using above code, it is saving single Custom class Store object in NSUserDefaults. So I would like to save all Store object in NSMutableArray after submit later ibaction. Later, I will fetch array of stores for uploading store on server one by one.

    Thanks.