如何处理多用户数据库

时间:2012-05-02 15:56:20

标签: ios database core-data persistence user-data

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

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

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

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

1 个答案:

答案 0 :(得分:22)

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下。