使用核心数据存储用户对象

时间:2012-06-07 11:51:54

标签: core-data stay-logged-in

我有一个问题:)我经常遇到我有一些对象(书籍说)和用户列表的情况。每个用户都有一些书。还有一个当前登录用户的特殊情况,其具有比普通用户更多的属性(发布权限,收藏夹)等。

在之前的所有项目中,我一直在创建User的子类,名为CurrentUser,并在其中添加当前用户属性/逻辑(例如,普通用户无法注销)。但我总是遇到确保只存在一个CurrentUser对象的问题。

其他人如何做到这一点?我正确地做到了吗?

1 个答案:

答案 0 :(得分:0)

我不太确定我理解你的问题,但如果你想控制CurrentUser只有一个实例,我会设置一种单身类,比如说SessionController,具有CurrentUser类型的属性。

因此,您可以在任何地方访问该属性,并且您知道它只有该类的一个实例,因此只有当前用户的一个属性。

CurrentUser* cu = [[SessionController sharedSessionController] currentUser];
if(!cu) // allowed
else // not allowed

当您登录(或其他)时,您将填充该属性。当您注销时,将其设置为零。如果您想与其他用户一起输入,您可以检查该属性。这是一种在大多数情况下都可以使用的简单方法。

关于你的问题,我不太清楚为什么你将User实体子类化。但也许有一些动机。处理子类时要注意。事实上,如果您使用sqlite存储,Core Data会使您创建的子类变平。因此,在您的情况下,您只有一个User表,其中包含您在CurrentUser中创建的属性。

修改

阅读问题的标题,如果必须使用db文件完成控制,我将创建一个名为LoggedUser的实体并避免使用子类。

您可以在此处存储当前用户的ID以及您想要的其他属性。

然后,如果您想验证是否有一个用户已经登录,您只需设置如下的请求:

NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `LoggedUser`
if(count >= 1) // not allowed
else // allowed