Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

save and restore an array of custom objects

I have an NSArray of custom objects that I want to save and restore. Can this be done with NSUserDefaults?

like image 937
node ninja Avatar asked Sep 06 '10 01:09

node ninja


2 Answers

You can still use NSUserDefaults if you archive your array into NSData.

For Archiving your array, you can use the following code:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"mySavedArray"];

And then for loading the custom objects in the array you can use this code:

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *savedArray = [currentDefaults objectForKey:@"mySavedArray"];
if (savedArray != nil)
{
        NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
        if (oldArray != nil) {
                customObjectArray = [[NSMutableArray alloc] initWithArray:oldArray];
        } else {
                customObjectArray = [[NSMutableArray alloc] init];
        }
}

Make sure you check that the data returned from the user defaults is not nil, because that may crash your app.

The other thing you will need to do is to make your custom object comply to the NSCoder protocol. You could do this using the -(void)encodeWithCoder:(NSCoder *)coder and -(id)initWithCoder:(NSCoder *)coder methods.


EDIT.

Here's an example of what you might put in the -(void)encodeWithCoder:(NSCoder *)coder and -(id)initWithCoder:(NSCoder *)coder methods.

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

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [[CustomObject alloc] init];
    if (self != nil)
    {
        aLabel = [coder decodeObjectForKey:@"label"];
        aNumberID = [coder decodeIntegerForKey:@"numberID"];
    }   
    return self;
}
like image 144
Joshua Avatar answered Oct 31 '22 14:10

Joshua


NSUserDefaults cannot write custom objects to file, only ones it knows about (NSArray, NSDictionary, NSString, NSData, NSNumber, and NSDate). Instead, you should take a look at the Archives and Serializations Programming Guide, as well as the NSCoding Protocol Reference, if you're looking to save and restore custom objects to disk. Implementing the protocol is not terribly difficult, and requires very little work.

like image 35
Itai Ferber Avatar answered Oct 31 '22 14:10

Itai Ferber