【问题标题】:Using core data to store user objects使用核心数据存储用户对象
【发布时间】:2012-06-11 11:21:00
【问题描述】:

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

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

其他人是怎么做到的?我这样做对吗?

【问题讨论】:

    标签: core-data stay-logged-in


    【解决方案1】:

    我不太确定我是否理解您的问题,但是如果您想控制只有一个 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
    

    【讨论】:

    • 好的,我将采用您在编辑中提出的解决方案。我还注意到了子类化问题。有谁知道 CoreData 使用平面数据库还是这类多表数据库更有效?我知道在 Android 上我总是以平面数据库为目标......
    • 视情况而定。如果你使用多表数据库,你需要做更多的工作来从不同的表中检索数据。相反,当您使用平面属性时,您可能会在内存中拥有大量对您的应用程序无用的属性。如果需要,标记为答案和/或更新。干杯。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多