2014-03-25 43 views
-1

的NSMutableDictionary數據,我有兩個UITextField文件不儲蓄錯誤的文件目錄

  1. 電子郵件
  2. 密碼

這兩個字段的值存儲在一個NSMutableDictionary電話userData。現在我想將這兩個字段值保存在一個文件中,以便記錄保留在那裏,並且我可以恢復此記錄以正確檢查用戶登錄。在這裏我想完成那個,但不工作。

我的代碼:

-(void) saveRegistrationData 
{ 
    userData = [[NSMutableDictionary alloc] 
       initWithObjects:[[NSMutableArray alloc] initWithObjects:@"123456", nil] 
       forKeys:[[NSMutableArray alloc] initWithObjects:@"[email protected]", nil]]; 

    [userData setObject:passwordTextField.text forKey:emailTextField.text]; 

    NSString *savePath = [@"/MediaFiles/Documents/" stringByExpandingTildeInPath]; 
    [userData writeToFile: savePath atomically: YES]; 

    //[userData writeToFile:@"MediaFiles/Documents/" atomically:YES]; 

    for (id key in userData) 
    { 
     NSLog(@"%@ is for %@", key, [userData objectForKey:key]); 
    } 
} 

我覺得path沒有正確設置。如果有任何類似的解決方案,請與我分享。先謝謝了。祝你有美好的一天。

回答

4

這不起作用的原因有幾個。

1)您正在寫入設備文件系統根目錄中的文件夾。 Apple會使用沙箱來防止發生這種情況,因爲您可以覆蓋和修改任何系統文件。

2)您正在寫入文件夾而不是文件。要寫入文件,您需要指定文件名(和擴展名)。即"/MediaFiles/Documents/dnt_lk_at_dis.plist"

爲了解決這些問題,您需要首先獲取沙箱(文檔目錄)的路徑,然後附加文件路徑。

NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *filename = @"secret.plist"; 
NSString *filePath = [docsPath stringByAppendingPathComponent:filename]; 

此外,我強烈建議您使用鑰匙串來存儲敏感用戶信息。任何擁有越獄設備的人或任何有權訪問文件系統的人都可以在用戶以純文本形式存儲時提取用戶的信息。至少,請在將密碼寫入磁盤之前加密密碼。

+0

感謝您的好解釋。實際上,我嘗試了其他許多選項,如'/ MediaFiles/Documents/dnt_lk_at_dis.txt',但它們都沒有工作。除此之外,我還看到了一些關於它的教程。如何使用plist在其中存儲數據。但是,對我來說看起來有點複雜。如果我使用'NSSearchPathForDirectoriesInDomains',那麼在轉到庫後,假設我找到'secret.txt'文件,檢查數據是否真的在那裏保存?感謝分享安全問題,我會努力工作。 – Tulon

+0

@Tulon由於我提到的第一個問題,該路徑將不起作用,我發佈的代碼將可以工作。您可以通過NSLog(@「%@」,filePath)'查看它是否寫入磁盤,然後進入Finder中的包含文件夾(在iOS模擬器上運行應用程序) –

+0

是的,您太棒了。它正在工作,我發現'secret.txt'跟蹤'NSLog'目錄。但是現在我明白了一點,在'NSMutableDictionary'中,以前的數據不會像數據庫那樣保存。當我給出輸入時,我以前的記錄已經從'secret.txt'中消失了,並且取代了最新的記錄。這意味着我不能使用'NSMutableDictionary'作爲數據庫,不是嗎? – Tulon

1
-(void) saveRegistrationData 
{ 
    userData = [[NSMutableDictionary alloc] init]; 


    [userData setObject:passwordTextField.text forKey:@"password"]; 
    [userData setObject:emailTextField.text forKey:@"email"]; 


    // Alternative to the above: 
     userData = [[NSMutableDictionary alloc] 
       initWithObjects:[[NSMutableArray alloc] initWithObjects:passwordTextField.text, emailTextField.text, nil] 
       forKeys:[[NSMutableArray alloc] initWithObjects:@"password", @"email" nil]]; 


    NSString *savePath = [@"/MediaFiles/Documents/myDict.plist" stringByExpandingTildeInPath]; // write to a file, not a dictionary 
    [userData writeToFile: savePath atomically: YES]; 

    for (id key in userData) 
    { 
     NSLog(@"%@ is for %@", key, [userData objectForKey:key]); // now you should see the result that you want to. 
    } 

    // Alternative for the above - the lazy way of doing it: 
    NSLog (@"theDictionary: %@", userData); 
} 

請原諒我任何錯別字。我沒有爲你編譯它:-)

+0

非常感謝,它正在工作,祝你有美好的一天:) – Tulon

+0

我很欣賞downvotes,尤其是當他們帶有一些解釋性評論時。這個答案有什麼問題? –

+0

是的,我同意你的看法。等待一秒鐘,使其達到最高。 :) – Tulon