【问题标题】:CoreData - Store one entity as 'active'CoreData - 将一个实体存储为“活动”
【发布时间】:2016-01-20 00:56:10
【问题描述】:

给定一组核心数据实体(我们称它们为短语),将一个短语作为“活动短语”并在给定时间仅强制执行一个活动短语的最佳/最正确方法是什么。

我曾考虑在短语实体上使用 Bool 值,但我不知道如何强制 true 仅出现在集合中的一个实体上。我想我也可以有另一个实体(activePhrase),它只在其中存储一条记录,但我再次不确定如何强制执行“从多个短语中选择一个激活”要求。

我担心这可能是一个愚蠢的问题 - 我的 CoreData(实际上是数据库)知识有点生疏,我想确保我遵循最佳步骤。

【问题讨论】:

    标签: ios macos core-data


    【解决方案1】:

    我会获取活动对象的对象 ID 并将其保存在用户默认值中。

    你会得到一些可以保存的东西:

    1. 向托管对象询问其objectID
    2. 向对象 ID 询问其 URIRepresentationNSURL
    3. 使用NSKeyedArchiverarchivedDataWithRootObject 方法将NSURL 转换为NSData

    然后将其保存为用户默认值。为了扭转这个过程,

    1. 从用户默认值中读取 NSData 对象
    2. 使用NSKeyedUnarchiverunarchiveObjectWithData 方法将其转换回NSURL
    3. 使用NSPersistentStoreCoordinatormanagedObjectIDForURIRepresentation 方法将NSURL 转换回NSManagedObjectID
    4. 使用NSManagedObjectContextexistingObjectWithID方法获取实际的托管对象。

    【讨论】:

    • 酷 - 这是一个很好的答案,谢谢。那么,您不知道在数据库内部完成所有操作吗?我希望将其全部封装在数据模型中。
    • 您可以创建一个与您的短语实体具有一对一关系的ActiveObject 实体。如果您确保只创建一个 ActiveObject 实例,则可以使用它来查找您的实体的单个实例。
    • 我也是这么想的。这有点恶心-确保只有一个实例-我认为可能有一些不错的方法。在这个阶段,我可能会像你建议的那样使用 NSDefaults。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多