ios - 如何处理多用户数据库

标签 ios database core-data persistence user-data

我的应用程序就像很多应用程序一样——它有一个登录屏幕,用户可以在其中输入用户名和密码,还有一个登录按钮我的应用程序还使用 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/

相关文章:

Java H2 数据库框架

ios - 删除 TableView 中的核心数据对象

ios - 为什么 calculateAccumulatedFrame 会给出意想不到的 CGRect?

sql - 如何存储稀疏邻接矩阵

mysql - 如何将数据库的一列拆分为多列并将日期时间数据类型的值与字符串数据类型的值进行比较

cocoa - 为什么我的 newObject 方法没有被调用?

iphone - NSFetchedResultsController 由字符串的第一个字母创建的部分

objective-c - UISwitch 在 IOS5 模拟器和设备上看起来很奇怪

ios - iOS 上的双 AVCaptureSession 输出

ios - 防止 UICollectionView 中每个 UICollectionViewCell 中的内容在我滚动时发生变化?