iPhone read/write .plist file

I’m making a application where I need to store some information the user have provided. I try to use a .plist file to store the information, I found this:

NSString *filePath = @"/Users/Denis/Documents/Xcode/iPhone/MLBB/data.plist";
NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
[plistDict setValue:@"Man" forKey:@"Gender"];
[plistDict writeToFile:filePath atomically: YES];

The problem is that the application will only work as long as I’m testing it in the iPhone simulator. I’ve tried this Changing Data in a Plist but without luck. I have also read something about that I need to add it to my bundle, but how?

  • How do you pass objects between View Controllers in Objective-C?
  • Finding the current view when application enter foreground. IOS
  • Retrieve data from plist
  • Why I did not receive any notification on my iPhone?
  • iPad keyboard will not dismiss if modal ViewController presentation style is UIModalPresentationFormSheet
  • Can ABNewPersonViewController be used to edit existing records?
  • New code:

    - (IBAction)segmentControlChanged{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistLocation = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
    NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:plistLocation];
    
    if (Gender.selectedSegmentIndex == 0) {
        [plistDict setObject:@"Man" forKey:@"Gender"];
        [plistDict writeToFile:plistLocation atomically: YES];
    }
    else
    {
        [plistDict setObject:@"Women" forKey:@"Gender"];
        [plistDict writeToFile:plistLocation atomically: YES];
    }
    }
    

    2 Solutions Collect From Internet About “iPhone read/write .plist file”

    I guess you have added your plist file to your resources folder in Xcode (where we place image, if not then you need to place that first). Resources data goes to [NSBundle mainBundle] by default and iOS does not allow us to change data inside bundle. So first you need to copy that file to Documents Directory.

    Here is the code for copying file from NSBundle to the Documents directory.

    - (NSString *)copyFileToDocumentDirectory:(NSString *)fileName {
        NSError *error;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask,
                                                             YES);
        NSString *documentsDir = [paths objectAtIndex:0];
        NSString *documentDirPath = [documentsDir
                                          stringByAppendingPathComponent:fileName];
    
        NSArray *file = [fileName componentsSeparatedByString:@"."];
        NSString *filePath = [[NSBundle mainBundle]
                                             pathForResource:[file objectAtIndex:0]
                                                      ofType:[file lastObject]];
    
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL success = [fileManager fileExistsAtPath:documentDirPath];
    
        if (!success) {
            success = [fileManager copyItemAtPath:filePath
                                           toPath:documentDirPath
                                            error:&error];
            if (!success) {
            NSAssert1(0, @"Failed to create writable txt file file with message \
                                             '%@'.", [error localizedDescription]);
            }
        }
    
        return documentDirPath;
    }
    

    Now you can use the returned documentDirPath to access that file and manipulate (Read/Write) over that.

    The plist structure is:

    <array>
        <dict>key-value data</dict>
        <dict>key-value data</dict>
    </array>
    

    Here is code to write data into plist file:

    /* Code to write into file */
    
    - (void)addToMyPlist {
        // set file manager object
        NSFileManager *manager = [NSFileManager defaultManager];
    
        // check if file exists
        NSString *plistPath = [self copyFileToDocumentDirectory:
                                                           @"MyPlistFile.plist"];
    
        BOOL isExist = [manager fileExistsAtPath:plistPath];    
        // BOOL done = NO;
    
        if (!isExist) {
            // NSLog(@"MyPlistFile.plist does not exist");
            // done = [manager copyItemAtPath:file toPath:fileName error:&error];
        }
        // NSLog(@"done: %d",done);
    
        // get data from plist file
        NSMutableArray * plistArray = [[NSMutableArray alloc]
                                               initWithContentsOfFile:plistPath];
    
        // create dictionary using array data and bookmarkKeysArray keys
        NSArray *keysArray = [[NSArray alloc] initWithObjects:@"StudentNo", nil];
        NSArray *valuesArray = [[NSArray alloc] initWithObjects:
                                       [NSString stringWithFormat:@"1234"], nil];
    
        NSDictionary plistDict = [[NSDictionary alloc]
                                                      initWithObjects:valuesArray
                                                              forKeys:keysArray];
    
        [plistArray insertObject:poDict atIndex:0];
    
        // write data to  plist file
        //BOOL isWritten = [plistArray writeToFile:plistPath atomically:YES];
        [plistArray writeToFile:plistPath atomically:YES];
    
        plistArray = nil;
    
        // check for status
        // NSLog(@" \n  written == %d",isWritten);
    }
    

    Are you using that same path on your device? Apps on a device are sandboxed and can only read/write files in their documents directory. Grab that file path like this and append your plist name. This approach will also work on the simulator.

    Try this:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistLocation = [documentsDirectory stringByAppendingPathComponent:@"myplist.plist"];