多个用户的首选项持久化的最佳方法(NSUserDefaults、XML文件还是数据库)

6
我正在创建一款iOS应用程序,可以管理用户并登录他们。
我想要持久化每个用户的用户数据设置,但我不确定最好的方法是什么以便为每个用户保存这些设置。
我应该将数据保存到XML文件、NSUserDefaults或甚至保存到我的Parse云数据库中吗?
我只想在加载视图时保存一个用户属性列表,但我必须考虑到我的应用程序必须为当前用户加载正确的参数。
例如:
用户:彼得 跟踪开关已启用:是
用户:莫里 跟踪开关已启用:否
用户:保罗 跟踪开关已启用:是

我只能说数据库会过度,不要用它来达到那个目的。 - 最白目
5个回答

10
  • 存储敏感信息时才使用钥匙串。
  • 除非你愿意做很多工作,否则不要使用Core Data或XML(除非是plist)。
  • 没有理由就不要使用Parse,因为用户数据取决于你支付账户和用户的连接。
  • 使用NSUserDefaults,键=“user”,值=JSON字符串。您可以将其解析为/自对象。
  • 如果您懒得打键盘,可以使用复合键,例如:键="Mary|tracking",值=YES。

奖励ASCII艺术!

                           NSUserDefaults   plist    Core Data   SQList
    Full text search           ✘              ✘          ✘         ✔
    Complex search             ✘              ✘          ✔         ✔
    Binary data                ✘              ✘          ✔         ✔
    Allows complex data        ★              ★★        ★★★★     ★★★★
    Performance                ★              ★         ★★★      ★★★★
    Learning curve             ★              ★★        ★★★      ★★★★

最后,我认为解决多用户设置问题的最佳方法是使用NSUserDefaults,键=key=user,值=JSON字符串。您可以将其解析为/从对象解析。 - Jesús Hurtado
1
不一定非要用JSON字符串,您也可以使用NSDictionary。这样可能更简单,因为您不需要解析它。也可以使用NSObject子类,只要您实现了适当的方法。尤其是如果您有多个首选项要保存的时候。 - shim

4

如果你想使用NSUserDefaults,应该使用initWithSuiteName:创建不同的数据库。

[[NSUserDefaults alloc] initWithSuiteName:USER_IDENTIFY]


0

为了保存用户凭据,我建议使用苹果的KeychainItemWrapper类:

您可以使用它来保存像这样的值(例如,使用电子邮件/密码文本字段)

        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"myAppLogin" accessGroup:nil];        
        [keychainItem setObject:txtPassword.text forKey:(__bridge id)(kSecValueData)];
        [keychainItem setObject:txtEmail.text forKey:(__bridge id)(kSecAttrAccount)];
        }

然后,当您想要从钥匙串中获取值时,只需:

        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"myAppLogin" accessGroup:nil];
        NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc]init];
        [myDictionary setObject:[keychainItem objectForKey:(__bridge id)(kSecAttrAccount)] forKey:@"email"];
        [myDictionary setObject:[keychainItem objectForKey:(__bridge id)(kSecValueData)] forKey:@"password"];

另外,别忘了从我在顶部发布的developer.apple.com链接下载KeychainItemWrapper.h和.m文件 :)

所以,基本上就是解释了Steve说的内容 :)


不错的信息,但在我的情况下是关于归档用户配置文件。 - Jesús Hurtado
哦,为此我会使用NSUserDefaults或CoreData :) 这取决于数据结构的大小 :) - Yanchi
顺便说一下,我认为将其用于多个用户不是一个好主意... 我只会为一个用户这样做。对于多个用户,将数据保存到文件中。 - Yanchi

0

这是一份关于应用程序偏好设置和设置的好指南。

关于偏好设置和设置

简而言之,您应该使用NSUserDefaults。


看起来这是最好的解决方案,但我不确定是否可以将NSUserDefaults用于多个用户。 - Jesús Hurtado
1
您可以定义自己的键值对,所以这应该不是问题。 - patrickS

0

使用NSUserDefault不是保存用户登录详细信息的好主意。 最好使用动态plist或xml。 请阅读这里了解另一种更好的方法。


3
重点不是保存登录详情,而是用户配置。 - Jesús Hurtado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接