如何处理多用户数据库
Posted
技术标签:
【中文标题】如何处理多用户数据库【英文标题】:How to deal with a multiple-user database 【发布时间】:2012-05-02 15:56:19 【问题描述】:我的应用程序和很多应用程序一样——它有一个登录屏幕,用户可以在其中输入用户名和密码,还有一个登录按钮 我的应用程序还使用 Core Data 来保存用户的大部分业务对象,当然是用户特定的。
我还有一个退出按钮来启用切换用户。这不会发生很多,但它仍然是必要的)。
现在,如果其他用户登录,我需要获取他的特定数据。但是我该怎么做呢? 我不想在用户退出时删除他的数据库,即使其他用户从设备登录,我也想保存它。
我唯一能想到的就是为我通过 Core Data 保存的每个实体添加一个“ownerId”属性,并在我获取对象时将此属性用作谓词。 但这似乎太混乱了。
【问题讨论】:
【参考方案1】:ios 并没有真正的多用户概念,因此“登录”的范围仅限于您的应用。最简单的解决方案是为每个用户的持久存储使用不同的文件名。这仅在一个地方派生(无论您在哪里设置核心数据堆栈),因此实现起来非常简单。
在标准核心数据模板中,持久存储位置设置在应用程序委托的persistentStoreCoordinator
方法内。就是这一行:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataTemplate.sqlite"];
这基本上意味着数据将存储在documents目录下的sqlite数据库文件中,该文件将被称为coreDataTemplate.sqlite
。
假设在执行此代码之前,您已经让用户登录,并根据一些列表检查了他们的用户 ID,并为他们提供了一个唯一标识符。进一步假设标识符已存储在用户默认值中。
将上面的行改为:
NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:@"loggedOnUserID"];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@_coreDataTemplate.sqlite",userIdentifier]];
这将为您的用户提供一个唯一的文件名。
如果您更改用户,则需要保存当前托管对象上下文,然后将持久存储协调器和应用委托的托管对象上下文设置回 nil。当他们被重新访问时,它将在新的用户 ID 下。
【讨论】:
我使用 xCode 核心数据模板,所以我真的不知道在哪里以及如何使用不同的文件名,但这听起来是一个非常好的解决方案。您能指导我如何“重置”持久存储并通过不同的文件名加载吗? 可以,但要几个小时才能完成。 好的,完成 - 希望对您有所帮助。我自己没有做过这样的事情,我就是这样做的。 如果可以的话,我会接受你的回答 10 次!这非常有帮助并且很好地解释了:) managedObjectModel 呢?我还需要将其设置为零吗?我需要为每个用户设置不同的 modelURL 吗? 还有人这样做吗?自动版本迁移会发生什么?用户登录时是否会运行迁移?以上是关于如何处理多用户数据库的主要内容,如果未能解决你的问题,请参考以下文章