Search code examples
iosobjective-ciphoneplistread-write

getting data from plist to NSMutableArray and writing the NSMutableArray to same plist iPhone


Using this code I am trying to get the data from Templates.plist file but I am getting null value in array.

//from plist
NSString *path = [[NSBundle mainBundle] pathForResource:@"Templates" ofType:@"plist"];
NSMutableArray *arry=[[NSMutableArray alloc]initWithContentsOfFile:path];

NSLog(@"arrayArray:::: %@", arry);

This is my plist file:

Plist file

Also I want to know how can I add more strings to this plist file and delete a string from this plist.


Solution

  • First off you cannot write to anything in you mainBundle. For you to write to you plist you need to copy it to the documents directory. This is done like so:

    - (void)createEditableCopyOfIfNeeded 
    {
         // First, test for existence.
         BOOL success;
    
         NSFileManager *fileManager = [NSFileManager defaultManager];
         NSError *error;
         NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
         NSString *documentsDirectory = [paths objectAtIndex:0];
         NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"Template.plist"];
         success = [fileManager fileExistsAtPath:writablePath];
    
         if (success) 
             return;
    
         // The writable file does not exist, so copy from the bundle to the appropriate location.
         NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Template.plist"];
         success = [fileManager copyItemAtPath:defaultPath toPath:writablePath error:&error];
         if (!success) 
             NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
    }
    

    So calling this function will check if the file exists in the documents directory. If it doesn't it copies the file to the documents directory. If the file exists it just returns. Next you just need to access the file to be able to read and write to it. To access you just need the path to the documents directory and to add your file name as a path component.

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filePath = [docDir stringByAppendingPathComponent:@"Template.plist"];
    

    To get the data from the plist:

    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    

    To write the file back to the documents directory.

        [array writeToFile:filePath atomically: YES];