views:

95

answers:

2

I want to have some way of backing up the user defaults to a property list or XML, or some other appropriate file format that can be transfered over the net. How could I get a backup of these so that I can send them to a webserver and retrieve them back to the device and read them in to the user defaults database?

A: 

I'd suggest either XML or JSON. Both have pretty good frameworks that ease working with them (TouchXML and TouchJSON).

dusker
+2  A: 

Hi,

You can get a JSON string of the user defaults like this :

// You will need this at the top of your file
#import "CJSONSerializer.h"


// Get a dictionary of the user defaults
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];

// Convert them to JSON
NSString *json = [[CJSONSerializer serializer] serializeObject:dictionary];

and to read them back into the device you can just do the opposite :

// You will need this at the top of your file
#import "CJSONDeserializer.h"

// Get the data from the server and re-create the dictionary from it
NSData *jsonData = <YOUR DATA FROM THE SERVER>;
NSDictionary *dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:nil];

// Put each key into NSUserDefaults
for (id key in [dict allKeys]) {
    id object = [dict objectforKey:key];
    [NSUserDefaults standardUserDefaults] setObject:object forKey:key];
}
[[NSUserDefaults standardUserDefaults] synchronize];

Have a look at the TouchJSON project page for more details and the download link.

Hope that helps.

NB There's no error checking in the above code - you might run into problems if your JSON contains int / float / etc because setObject:forKey: will fail.

deanWombourne
why JSON, why not XML? Is JSON faster?
dontWatchMyProfile
JSON tends to use less data than XML but more importantly, I've used JSON before :)
deanWombourne