代码之家  ›  专栏  ›  技术社区  ›  user1046037

CoreData将一条记录标记为收藏夹(互斥)

  •  1
  • user1046037  · 技术社区  · 8 年前

    概述:

    • 我有一个 iOS 使用的应用程序 CoreData
    • 有一个名为 Animal
    • 它有一组记录 Lion , Tiger 和 Elephant
    • 我想标记 只有一个 最受欢迎的唱片。

    采用相同方法的类似实体:

    • 类似地,我可以有其他实体,例如 Car , Bike .
    • 每个实体都有一组记录。
    • 同样,每个实体应该只有一个收藏夹记录

    原因:

    • 应用程序具有创建新文档的选项
    • 创建新文档时,将使用每个实体的默认值填充该文档(通过选择每个实体的收藏夹记录)

    笔记 :在给定时间只能将一条记录标记为收藏夹

    我想到的可能模式:

    1、名为IsFavorite的字段

    • 在中创建字段 动物 打电话 isFavourite .
    • 仅将其中一行标记为 IsFavorite 像 true .
    • 维护isfavorite的大部分逻辑都是在代码中管理的。

    2、称为收藏夹的单独实体

    • 创建一个名为 Favourite 并在其中有一个虚拟行。
    • 从建立关系 最喜欢的 到 动物 打电话 animal .
    • 这将指向最喜爱的唱片。

    问题:

    1. 解决这个问题的首选方法是什么?
    2. 还有其他选择吗?
    2 回复  |  直到 6 年前
        1
  •  2
  •   Joseph Lord    8 年前

    使用选项2,可能称之为Config。如果要确保它只是一个单例,请添加一个唯一且只能为零的属性。

    如果反向关系为非nil,则可以编写一个返回true的助手计算的var。

    选项2的主要优点是更改收藏夹的简单性,您无需扫描所有项目即可将其设置为非收藏夹,只需在singleton配置中更改即可。

        2
  •  1
  •   Tom Harrington    8 年前

    考虑一下应用程序的其他部分,以及你将来可能想做什么。

    添加字段:工作正常,但需要一些代码来维护,这可能容易出错。另一方面,也许有一天该应用程序可能会允许多个收藏夹,而这正好可以解决这个问题。

    使用单独的实体:也可以正常工作,但会添加一个全新的实体,其中只有一个实例。一般来说,如果您有一个只需要一个实例的实体,那么您就做错了。另一方面,这也适用于多个收藏夹。

    第三种方法是保存 objectID 对于核心数据之外的最喜欢的动物,例如 UserDefaults . 保存它,然后使用 NSManagedObjectContext 的 existingObject(with:) 方法您无法保存 NSManagedObjectID 直接但你可以得到它的 uriRepresentation() 然后保存它。

    在大多数情况下,我可能会选择#1,但这取决于我在应用程序中还需要什么。