2012-02-17 32 views
5

Tôi đang tạo một ứng dụng mà tôi cần lưu trữ một số thông tin mà người dùng đã cung cấp. Tôi cố gắng sử dụng tệp .plist để lưu trữ thông tin, tôi đã tìm thấy thông tin này:iPhone đọc/ghi tập tin .plist

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]; 

Vấn đề là ứng dụng sẽ chỉ hoạt động miễn là tôi đang thử nghiệm trong trình mô phỏng iPhone. Tôi đã thử điều này Changing Data in a Plist nhưng không may mắn. Tôi cũng đã đọc một cái gì đó về điều đó tôi cần phải thêm nó vào gói của tôi, nhưng làm thế nào?

Code mới:

- (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]; 
} 
} 

Trả lời

8

Bạn đang sử dụng con đường tương tự trên thiết bị của bạn? Ứng dụng trên thiết bị được sandbox và chỉ có thể đọc/ghi tệp trong thư mục tài liệu của chúng. Lấy đường dẫn tệp đó like this và nối thêm tên plist của bạn. Cách tiếp cận này cũng sẽ hoạt động trên trình mô phỏng.

Hãy thử điều này:

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

Không, tôi đã không cố gắng để chạy nó trên một thiết bị "thực", nhưng tôi không nghĩ rằng nó sẽ chạy, bởi vì thư mục không tồn tại trên một thiết bị "thực". Tôi biết rằng họ chỉ có thể đọc/ghi từ thư mục riêng của họ, nhưng làm thế nào để tôi nói với Xcode sử dụng tệp có tên data.plist trong thư mục ứng dụng thay vì/Users/Denis/Documents/Xcode/iPhone/MLBB/data. plist? Tôi cảm thấy như n00b :-) – Deni

+0

Liên kết mà tôi đã đăng cho bạn thấy cách lấy thư mục tài liệu dưới dạng chuỗi. Sử dụng stringByAppendingString để thêm tên plist của bạn vào cuối, sau đó sử dụng mã bạn chỉ định. Đó là tất cả :) – Nick

+0

Xin lỗi, nhưng tôi không biết ý bạn là gì. Tôi đã viết NSString * filePath = [NSHomeDirectory() stringByAppendingPathComponent: @ "Documents"]; Nhưng tôi không nghĩ đó là ý của bạn. Bạn có thể vui lòng chỉnh sửa mã ở trên để nó hoạt động và khi viết nó ở đây. Tôi mới vào Xcode và bây giờ tôi biết làm thế nào nó cảm thấy là một n00b :-) – Deni

14

Tôi đoán bạn đã thêm tập tin plist của bạn vào thư mục tài nguyên của mình trong Xcode (nơi chúng tôi đặt hình ảnh, nếu không thì bạn cần phải đặt mà đầu tiên). Dữ liệu tài nguyên được chuyển đến [NSBundle mainBundle] theo mặc định và iOS không cho phép chúng tôi thay đổi dữ liệu bên trong gói. Vì vậy, trước tiên bạn cần sao chép tệp đó vào Thư mục Tài liệu.

Đây là mã để sao chép tệp từ NSBundle vào thư mục Tài liệu.

- (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; 
} 

Bây giờ bạn có thể sử dụng trả lại documentDirPath để truy cập tệp đó và thao tác (Đọc/ghi) qua đó.

Cấu trúc plist là:

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

Dưới đây là code để ghi dữ liệu vào tập tin plist:

/* 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); 
} 
+0

Tôi sẽ làm gì với mã này? Tôi đã thử chỉ dán nó, nhưng nó không hoạt động. Và tôi có cần phải đặt tên tệp ở đâu đó không? – Deni

+0

Thư mục tài nguyên ở đâu? – Deni

+0

Mã này là để có được đường dẫn cho tập tin plist, đó là gì, nhưng "plistLocation" trong mã của bạn. Đầu tiên bạn thêm tệp plist, với hình ảnh của bạn. Sau đó gọi phương thức này để lấy đường dẫn tệp plist, lưu trữ nó trong biến "plistLocation" của bạn và phần còn lại là tốt với mã của bạn – Mrunal

Các vấn đề liên quan