Ios NSMutableDictionary数据未保存在错误文件目录的文件中
我有两个Ios NSMutableDictionary数据未保存在错误文件目录的文件中,ios,objective-c,nsmutabledictionary,Ios,Objective C,Nsmutabledictionary,我有两个UITextField 电子邮件 密码 这两个字段值存储在NSMutableDictionarycalluserData中。现在我想将这两个字段值保存在一个文件中,以便记录保留在那里,并且我可以恢复此记录以检查用户登录是否正确。在这里,我想做到这一点,但不是工作 我的代码: -(void) saveRegistrationData { userData = [[NSMutableDictionary alloc] initWithObjects:[
UITextField
NSMutableDictionary
calluserData
中。现在我想将这两个字段值保存在一个文件中,以便记录保留在那里,并且我可以恢复此记录以检查用户登录是否正确。在这里,我想做到这一点,但不是工作
我的代码:
-(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数据库:(我很欣赏反对票,尤其是当他们有一些解释性的评论时。这个答案有什么错?是的,我同意你的看法。请等一秒钟,把它归结为一个问题。:)