Julia
Julia

Reputation: 7

Trying to load a saved NSMutableArray

This is the code I'm using to save an NSMutableArray "names" (after the user presses a save button), and I think it's working without problems, but I'm not sure what the corresponding code would be to then load my array when I reopen my app. Any help would be greatly appreciated!

- (IBAction)save:(id)sender {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    NSString *fullFileName = [NSString stringWithFormat:@"%@/temporaryArray", docDir];
    [NSKeyedArchiver archiveRootObject:names toFile:fullFileName];
}

Upvotes: 0

Views: 66

Answers (3)

Naresh Reddy M
Naresh Reddy M

Reputation: 1096

- (IBAction)save:(id)sender 
{
    // check for previous data persistancy.
    NSArray *arrData = [[NSUserDefaults standardDefaults]objectforkey:@"Paths"];
    if(arrData == nil)
    {
        // Maintain your old data and update it in new one to store the same.
        NSMutableArray *arrTempData = [NSMutableArray arrayWithArray:arrData];
        //Add Some data to old array based on your bussiness logic.
        [arrTempData add object:@"some data"];
        // Update in User Defaults
        [[NSUserDefaults standardDefaults]setobject:[NSArray arrayWithArray:arrTempData] forkey:@"Paths"];
    }
}

Somewhere in your code,put below code to get the data,

NSArray *arrSavedData = [[NSUserDefaults standardDefaults] objectforkey:@"Paths"];

Upvotes: 0

Nikolay Mamaev
Nikolay Mamaev

Reputation: 1474

If your array's contents are all property list objects (NSString, NSData, NSArray, or NSDictionary objects) then you can do saving and reading in a way other than using NSKeyedArchiever/NSKeyedUnarchiever:

- (IBAction)save:(id)sender 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    NSString *fullFileName = [docDir stringByAppendingPathComponent:@"temporaryArray"];
    [names writeToFile:fullFileName atomically:YES];
}

- (NSMutableArray*)readNames
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    NSString *fullFileName = [docDir stringByAppendingPathComponent:@"temporaryArray"];
    return [NSMutableArray arrayWithContentsOfFile:fullFileName];
}

Upvotes: 1

SevenBits
SevenBits

Reputation: 2874

Well, you're halfway there. You've figured out how to archive the object. The question is, how do you unarchive it? As I explained in my comment, this is done with the very aptly named NSKeyedUnarchiver class.

Let's begin with a code sample:

@try {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    NSString *defaultPath = [docDir stringByAppendingPathComponent:@"temporaryArray"];.

    self.yourArray = [NSKeyedUnarchiver unarchiveObjectWithFile: defaultPath];

    if (!self.yourArray) {
        NSLog(@"Error!");
    } else {
        // Success!
    }
} @catch (NSException *exception) {
    NSLog(@"Some error happened: %@", exception);
}

The NSKeyedUnarchiver class takes a path to a file containing the content archived by NSKeyedArchiver. It will then read this file and return the "root" object -- the object that you told NSKeyedArchiver to archive. It's that simple. (You should, of course, include error handling, which I gave a brief example of above.)

If you want another resource, you can read this great introductory article by the famous Mattt Thompson, which gives a good explanation of the concepts behind the class.

Hope this helps.

Upvotes: 1

Related Questions