【问题标题】:Core Data and User-Defined Attributes核心数据和用户定义的属性
【发布时间】:2020-07-21 15:01:42
【问题描述】:

我有一个最终是数据库程序的应用程序。目前,我正在使用“元素”对象的 NSMutableArray,它具有几十个预定义属性和一个属性,该属性是用于用户定义属性(在运行时定义)的可变字典。

为此,我使用valueForUndefinedKey:,它会在“用户字段”可变字典中进行查找。这一切都运行良好,并允许我基于内置属性和用户定义的属性构建谓词。

我正在考虑将其移至 Core Data,但无法确定允许用户定义属性(Core Data 中的属性)的方法。我可以创建一个可转换的属性,它是一个用户可以向其中添加键/值的字典,但无法搜索它。

我还认为我的内置属性/属性可以在 Core Data 中完成,然后一个单独的非 Core Data 数组可以为我的用户定义字段保存字典(基本上和现在一样)。这会很好用吗?

我有一个 NSTableView,它必须显示来自内置字段和用户定义字段(使用绑定)的列,我还需要能够构建包含这两种类型的谓词。

例如,我的元素是“人”,内置属性是姓名、生日、电话号码等,然后用户可以向这些元素添加字段,例如“品牌、型号、信用评分”等。

当我的应用程序必须允许创建用户定义的字段/属性/属性,同时仍使它们可以使用用户构建的谓词进行搜索时,我不确定 Core Data 是否适合此。

【问题讨论】:

    标签: macos cocoa core-data


    【解决方案1】:

    您是否考虑过定义一个实体来存储用户定义的键/值对?比如:

    这将允许您继续使用谓词来查询您的数据,例如:

    let request = NSFetchRequest<Person>(entityName: "Person")
    request.predicate = NSPredicate(format: "userDefined.key == %@", "somekey")
    

    或基于值或数据类型的查询:

    request.predicate = NSPredicate(format: "userDefined.value == %@", "somevalue")
    request.predicate = NSPredicate(format: "userDefined.dataType == %@", "String")
    

    您可以继续在UserDefined.value 上使用可转换类型或二进制类型,使用dataType 作为如何转换/解码数据的提示。

    【讨论】:

    • 这看起来很有希望。我的键是 UUID(基本上是字段标识符),值主要是字符串,所以我需要一个谓词,可能类似于:userDefined.key == someUUID AND userDefined.value == userTextEntry 而现在使用 NSArray 我可以使用 UUID 设置 NSPredicateEditor 的左侧, 一些比较运算符和右边的用户字符串。我正在尝试考虑如何将上述方法融入NSPredicateEditor,这样左侧仍然可以是一个包含生日、姓名、电话和我的键的英文名称的菜单。
    • 另一个问题是我需要确保一个 Person 不能有多个具有相同键的 UserDefined 记录。
    • 再想一想这种方法:在 NSTableView 中,很容易在一列中显示姓名或电话的值,但我将如何显示(在一列中)给定键的用户定义值对于给定的人(假设每个人在表中都有一行)?
    • 就使用 NSPredicateEditor 而言,您是否有理由不能为您的键使用“英文名称”?在这种情况下引入 UUID 的原因是什么?您必须编写代码来检查/禁止编写重复键。您将无法直接使用绑定到“UserDefined”值。也许在你的“Person”上写一个访问器来访问用户定义的顶级字段,并绑定到那些?
    • UUID 只是确保唯一性。访问器必须将键作为参数并在 UserDefined 对象中进行查找。不知道我是否可以这样绑定?我想我可以像现在一样使用 valueForUndefinedKey: 并绑定到未定义的键,然后查找该键。这似乎比在我当前的实现中使用这种技术的直接数组查找慢一个数量级。
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2010-11-22
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多