我的应用程序就像很多应用程序一样——它有一个登录屏幕,用户可以在其中输入用户名和密码,还有一个登录按钮我的应用程序还使用 Core Data 来保存大部分用户的业务对象,这当然是用户特定的。
我还有一个注销按钮来启用切换用户。这种情况不会经常发生,但仍然是必要的)。
现在,如果不同的用户登录,我需要获取他的特定数据。但是我该怎么做呢?
我不想在用户注销时删除他的数据库,我想保存它,即使其他用户从该设备登录也是如此。
我唯一能想到的就是为我通过 Core Data 保存的每个实体添加一个“ownerId”属性,并在我获取对象时使用这个属性作为谓词。
但这似乎太困惑了。
最佳答案
iOS 并没有真正的多用户概念,因此“登录”的范围仅限于您的应用。最简单的解决方案是为每个用户的持久存储使用不同的文件名。这仅在一个地方派生(无论您在何处设置核心数据堆栈),因此实现起来非常简单。
在标准核心数据模板中,持久存储位置在应用程序委托(delegate)的 persistentStoreCoordinator
方法中设置。就是这一行:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataTemplate.sqlite"];
这基本上意味着数据将存储在文档目录中的 sqlite 数据库文件中,该文件将称为 coreDataTemplate.sqlite
。
假设在执行此代码之前,您已让用户登录,并根据某个列表检查他们的用户 ID,并为他们提供一个唯一标识符。进一步假设标识符已存储在用户默认值中。
将上面的行更改为:
NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:@"loggedOnUserID"];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@_coreDataTemplate.sqlite",userIdentifier]];
这将为您的用户提供一个唯一的文件名。
如果您更改用户,则需要保存当前的托管对象上下文,然后将应用委托(delegate)的持久存储协调器和托管对象上下文设置回 nil。当他们重新访问时,它将在新的用户 ID 下。
关于ios - 如何处理多用户数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417353/