Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSMutableDictionary数据未保存在错误文件目录的文件中_Ios_Objective C_Nsmutabledictionary - Fatal编程技术网

Ios NSMutableDictionary数据未保存在错误文件目录的文件中

Ios NSMutableDictionary数据未保存在错误文件目录的文件中,ios,objective-c,nsmutabledictionary,Ios,Objective C,Nsmutabledictionary,我有两个UITextField 电子邮件 密码 这两个字段值存储在NSMutableDictionarycalluserData中。现在我想将这两个字段值保存在一个文件中,以便记录保留在那里,并且我可以恢复此记录以检查用户登录是否正确。在这里,我想做到这一点,但不是工作 我的代码: -(void) saveRegistrationData { userData = [[NSMutableDictionary alloc] initWithObjects:[

我有两个
UITextField

  • 电子邮件
  • 密码
  • 这两个字段值存储在
    NSMutableDictionary
    call
    userData
    中。现在我想将这两个字段值保存在一个文件中,以便记录保留在那里,并且我可以恢复此记录以检查用户登录是否正确。在这里,我想做到这一点,但不是工作

    我的代码:

    -(void) saveRegistrationData
    {
        userData = [[NSMutableDictionary alloc]
                    initWithObjects:[[NSMutableArray alloc] initWithObjects:@"123456", nil]
                    forKeys:[[NSMutableArray alloc] initWithObjects:@"admin@gmail.com", 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]);
        }
    }
    

    我认为路径设置不正确。如果有任何类似的解决方案,请与我分享。提前谢谢。祝你过得愉快。

    有几个原因它不起作用

    1) 您正在写入设备文件系统根目录中的文件夹。苹果使用沙箱来防止这种情况发生,因为你可以覆盖和修改任何系统文件

    2) 您正在写入文件夹而不是文件。要写入文件,需要指定文件名(和扩展名)。i、 e.
    “/MediaFiles/Documents/dnt\u lk\u at\u dis.plist”

    为了解决这些问题,您需要首先获取沙盒(documents目录)的路径,然后追加文件路径

    NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filename = @"secret.plist";
    NSString *filePath = [docsPath stringByAppendingPathComponent:filename];
    
    此外,我强烈建议您使用钥匙链来存储敏感的用户信息。任何拥有越狱设备的人,或者任何能够访问文件系统的人,如果用户的信息以纯文本形式存储,都能够提取出来。至少,请在将密码写入磁盘之前对其进行加密

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

    请原谅我的打字错误。我没有为您编译:-)

    谢谢您的精彩解释。事实上,正如你所说,我尝试了其他许多选项,比如
    /MediaFiles/Documents/dnt\u lk\u at_dis.txt
    ,但它们都不起作用。此外,我还看到了一些关于它的教程。如何使用plist在其中存储数据。但是,我觉得有点复杂。如果我使用
    NSSearchPathForDirectoriesInDomains
    ,那么在我找到
    secret.txt
    文件的库之后,检查数据是否确实保存在那里?谢谢分享安全问题,我会解决它。@Tulon由于我提到的第一个问题,该路径将不起作用,我发布的代码肯定会起作用。您可以通过
    NSLog(@“%@”,filePath)
    检查它是否正在写入磁盘,然后转到Finder中的包含文件夹(已在iOS模拟器上运行该应用程序)是的,您很好。它正在工作&我找到了
    secret.txt
    跟踪
    NSLog
    目录。但现在我意识到,在
    NSMutableDictionary
    中,以前的数据不像数据库那样保存。每次输入时,我以前的记录都会从
    secret.txt
    中消失,并替换为最新的记录。这意味着我不能使用
    NSMutableDictionary
    作为数据库,不是吗?@Tulon谢谢!我真的不明白你的意思?一旦写入同一文件路径,旧数据当然会被覆盖。你的目标是什么?我在想,所有的输入值都会一个接一个地保存在目录文件中,我可以在用户登录时提取这些数据。但我想我必须继续使用sqlite才能做到这一点。NSMUtableDictionary无法使用like数据库:(我很欣赏反对票,尤其是当他们有一些解释性的评论时。这个答案有什么错?是的,我同意你的看法。请等一秒钟,把它归结为一个问题。:)