2015-12-24 63 views
1

我是Objective C新手,目前正在研究iPhone應用程序。我的應用程序需要用戶輸入(字符串)並將它們存儲,因此我使用plist來存儲數據。目前,我可以從plist文件中讀取。但是,當我試圖寫入plist文件時,文件本身根本不會改變。編輯plist文件(目標c)

我想要做的是將用戶的輸入追加到現有的plist文件。所以我讀plist文件並將數組存儲到mutableArray。然後,我使用addObject函數在mutableArray的末尾添加新的用戶輸入。直到這一點,一切工作正常,而mutableArray正是我想要的。最後一步是什麼不是爲我工作:

[mutableArray writeToFile:[self dataFilePath] atomically:YES];

我認爲執行該行後我的plist文件(位於我的資源文件夾h和.m文件一起)應改變並且應該追加新的用戶輸入,但該文件似乎根本沒有改變。

我讀過一些人說我應該將plist文件從NSBundle複製到Documents目錄,因爲plist文件位於資源文件夾中,但在youtube上幾乎所有教程中都沒有這樣的問題並且他們的代碼仍然可以在資源文件夾中使用plist文件。

非常感謝您的幫助。

+0

那** **是問題。您無法寫入iOS應用程序包 – vadian

+0

如果plist位於應用程序包中,則它不能在真實設備上寫入。快速測試將在模擬器上運行您的代碼。如果保護是問題,我相信它可以在模擬器上工作,並在手機上失效。 –

+0

謝謝vadian和菲利普!還有一個問題:我應該只在第一次啓動應用程序時從包中將plist文件複製到文檔目錄並從那裏訪問它?還是有另一種方法來做到這一點?我想從開始就沒有理由在資源文件夾中包含plist文件,因爲我可以在應用程序啓動並從那裏開始時在文檔目錄中創建一個新的plist文件。 – Chandler

回答

0

是的,你必須從一個NSBundle複製文件到NSDocumentUser例如文件 「NimrokhRavanshenasi.sqlite3」

NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *writableDbtPath = [documentsDirectory stringByAppendingPathComponent:@"NimrokhRavanshenasi.sqlite3"]; 

BOOL success = [fileManager fileExistsAtPath:writableDbtPath]; 
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"NimrokhRavanshenasi.sqlite3"]; 
NSError *error; 
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDbtPath error:&error]; 


NSFileManager *filemgr = [NSFileManager defaultManager]; 

sqlite3_stmt *compiledStatement; 
if([filemgr fileExistsAtPath:writableDbtPath]){ 
    if (sqlite3_open([writableDbtPath UTF8String], &_contactDB) != SQLITE_OK) { 
     NSLog(@"Failed to open database!"); 
+0

謝謝afshin和Ekta!我只是好奇,如果資源文件夾中需要plist文件,因爲我可以在應用程序啓動時在文檔目錄中創建一個新的plist文件,而不是從資源文件夾複製plist文件。 – Chandler

+0

File.sqlite3您可以將此代碼用於file.plist的示例,並繼續 – Moosa

+0

首先在NSBunlde上創建一個Plist文件,並使用此代碼將副本文件從NSBundle複製到NSDocumentUser – Moosa