如何处理多用户数据库

Eya*_*yal 10 database persistence core-data user-data ios

我的应用程序就像很多应用程序 - 它有一个用户输入用户名和密码的登录屏幕,以及一个登录按钮我的应用程序也使用Core Data来保存大多数用户的业务对象,当然这是用户特定的.

我还有一个注销按钮,可以切换用户.这不会发生很多,但仍然是必要的).

现在,如果其他用户登录,我需要获取他的特定数据.但是我该怎么办呢?
我不想在他注销时删除用户的数据库,即使其他用户从设备登录也要保存.

我唯一能想到的是为每个通过Core Data保存的Entity添加一个"ownerId"属性,并在我获取对象时将此属性用作谓词.
但这似乎太乱了.

jrt*_*ton 22

iOS实际上没有多个用户的概念,因此"登录"的范围将限制在您的应用程序中.最简单的解决方案是为每个用户使用不同的文件名作为持久性存储.这只是在一个地方(无论你在哪里设置核心数据堆栈)派生,所以实现起来非常简单.

在标准核心数据模板中,持久性存储位置设置在persistentStoreCoordinator应用程序委托的方法内.就是这条线:

 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataTemplate.sqlite"];
Run Code Online (Sandbox Code Playgroud)

这基本上意味着数据将存储在文档目录中的sqlite数据库文件中,并且将调用该文件coreDataTemplate.sqlite.

假设在执行此代码之前,您已经让用户登录,并根据某些列表检查了他们的用户ID,并为他们提供了唯一的标识符.进一步假设标识符已存储在用户默认值中.

将上面的行更改为:

NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:@"loggedOnUserID"];     
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@_coreDataTemplate.sqlite",userIdentifier]];
Run Code Online (Sandbox Code Playgroud)

现在,这将为您的用户提供唯一的文件名.

如果更改用户,则需要保存当前的托管对象上下文,然后将应用委托的持久性存储协调器和托管对象上下文设置为nil.重新加入时,它将在新的用户ID下.