我的应用程序和很多应用程序一样——它有一个登录屏幕,用户可以在其中输入用户名和密码,还有一个登录按钮.
我还有一个退出按钮来启用切换用户。这不会发生很多,但它仍然是必要的)。
现在,如果其他用户登录,我需要获取他的特定数据。但是我该怎么做呢?
我不想在用户退出时删除用户的数据库,即使其他用户从设备登录,我也想保存它。
我唯一能想到的就是为我通过 Core Data 保存的每个实体添加一个“ownerId”属性,并在我获取对象时使用这个属性作为谓词。
但这似乎太混乱了。
我的应用程序和很多应用程序一样——它有一个登录屏幕,用户可以在其中输入用户名和密码,还有一个登录按钮.
我还有一个退出按钮来启用切换用户。这不会发生很多,但它仍然是必要的)。
现在,如果其他用户登录,我需要获取他的特定数据。但是我该怎么做呢?
我不想在用户退出时删除用户的数据库,即使其他用户从设备登录,我也想保存它。
我唯一能想到的就是为我通过 Core Data 保存的每个实体添加一个“ownerId”属性,并在我获取对象时使用这个属性作为谓词。
但这似乎太混乱了。
iOS 并没有真正的多用户概念,因此“登录”的范围仅限于您的应用程序。最简单的解决方案是为每个用户的持久存储使用不同的文件名。这仅在一个地方派生(无论您在哪里设置核心数据堆栈),因此实现起来非常简单。
在标准核心数据模板中,持久存储位置是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]];
现在,这将为您的用户提供一个唯一的文件名。
如果更改用户,则需要保存当前托管对象上下文,然后将持久存储协调器和应用委托的托管对象上下文设置回 nil。当他们被重新访问时,它将在新的用户 ID 下。