Tuesday, August 16, 2011

How to Save array of custom class in NSUserDefaults ?

Lets say we have an array sampleArray which stores some objects of class called "MyClass"

       sampleArray=[[NSMutableArray alloc]init];
    
    
    MyClass *obj1=[[MyClass alloc]init];
    obj1.name=@"Reetu";
    obj1.sex=@"F";
    obj1.income=@"12";
    obj1.city=@"GUN";
    obj1.mothername=@"ReetuSr.";
    obj1.ethnicity=@"Asian";
    obj1.fathername=@"ReetuDad";
    obj1.countOpen=1;
    [sampleArray addObject:obj1];
    
    MyClass *obj2=[[MyClass alloc]init];
    obj2.name=@"Pinku";
    obj2.sex=@"M";
    obj2.income=@"1223";
    obj2.city=@"ASC";
    obj2.mothername=@"PinkuSr.";
    obj2.ethnicity=@"American";
    obj2.fathername=@"PinkuDad";
    obj2.countOpen=2;
    [sampleArray addObject:obj2];
    
    MyClass *obj3=[[MyClass alloc]init];
    obj3.name=@"Mike";
    obj3.sex=@"M";
    obj3.income=@"125";
    obj3.city=@"PENN";
    obj3.mothername=@"Fred.";
    obj3.ethnicity=@"Caucasian";
    obj3.fathername=@"Fred";
    obj3.countOpen=6;
    [sampleArray addObject:obj3];





Now you want to save this array called sampleArray in NSUserDefault. You will have to use following code.
       NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:sampleArray];
    [userDefault setObject:myEncodedObject forKey:[NSString stringWithFormat:@"sample"]];




    

As you can see, you will have to use NSKeyedArchiver. you can't use straightforward setObject here otherwise you will get warning like:


-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '' of class 'MyClass'.


Later on, when you want to fetch your array from NSUserDefault, you can write following code. Remember it will return non-mutable array.

       //Lets decode it now
    NSData *myDecodedObject = [userDefault objectForKey: [NSString stringWithFormat:@"sample"]];
    NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject];
    
    
    //Print the array received from User's Default 
    for (MyClass *item in decodedArray) {

        NSLog(@"name=%@",item.name);
        NSLog(@"sex=%@",item.sex);
        NSLog(@"income=%@",item.income);
        NSLog(@"city=%@",item.city);
        NSLog(@"-----------");
    }
    


Well. Last thing, don't forget to add following encode and decode method in your MyClass.


- (void)encodeWithCoder:(NSCoder *)encoder
{
    
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:self.sex forKey:@"sex"];
    [encoder encodeObject:self.income forKey:@"income"];
    [encoder encodeObject:self.city forKey:@"city"];
    [encoder encodeObject:self.mothername forKey:@"mothername"];
    [encoder encodeObject:self.ethnicity forKey:@"ethnicity"];
    [encoder encodeObject:self.fathername forKey:@"fathername"];    
    [encoder encodeObject:[NSNumber numberWithInt:self.countOpen] forKey:@"destinationCode"];

    
}
- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if( self != nil )
    {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.sex = [decoder decodeObjectForKey:@"sex"];
        self.income = [decoder decodeObjectForKey:@"income"];
        self.city = [decoder decodeObjectForKey:@"city"];
        self.mothername = [decoder decodeObjectForKey:@"mothername"];
        self.ethnicity = [decoder decodeObjectForKey:@"ethnicity"];
        self.fathername = [decoder decodeObjectForKey:@"fathername"];
        self.countOpen = [[decoder decodeObjectForKey:@"countOpen"] intValue];
        
    }
    return self;
}


where MyClass has declaration as following


@interface MyClass : NSObject {
    
    NSString *name;
NSString *sex;
NSString *income;
NSString *city;
NSString *mothername;
NSString *ethnicity;
NSString *fathername;
    int countOpen;
}


I have created a sample code for those who still need some clarification. Hope this helps.

Download the Sample Code.

4 comments:

  1. Thank you so much for this. It was a great help to me!

    ReplyDelete
  2. Very good tutorial. But I have one question, how to get NSMutableArray like variable in Class???

    ReplyDelete
  3. Really nice post, you got great blog and Thank you for sharing This excellently written content. Waiting for next one.
    Acer Laptops

    ReplyDelete