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



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

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

其他人是怎么做到的?我这样做是否正确?

我不太确定我是否理解您的问题,但是如果您想控制只有一个实例CurrentUser我将设置一种单例类,例如SessionController,它具有类型CurrentUser的属性。

因此,

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

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

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

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

编辑

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

在这里,您可以存储当前用户的 id 和所需的其他属性。

然后,如果要验证是否已记录一个用户,只需设置如下所示的请求:

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

相关内容

  • 没有找到相关文章

最新更新