Можно ли включить тип сущности Core Data в ограничение? - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю с Core Data + Swift 4.2 + Xcode 10. В моей модели данных у меня есть абстрактная сущность A, у которой нет родительской сущности, сущность B, у которой A является родительской, а C - у A родитель.

У объекта A есть поле метки времени, которое, следовательно, наследуется B и C. Я хотел бы наложить ограничение на то, что метка времени должна быть уникальной в пределах типа сущности. То есть я хочу, чтобы все элементы B имели уникальные отметки времени, а все элементы C - уникальные отметки времени, но некоторые элементы B могут иметь такую ​​же отметку времени, что и некоторые элементы C.

Есть ли способ выразить это ограничение в XCode? В поле «Ограничения» в редакторе сущностей требуется список атрибутов. Отметка времени является атрибутом, так что все в порядке, но тип сущности (B или C) - нет. Поэтому я не вижу способа включить тип объекта.

Возможно ли, что тип сущности является неявным атрибутом? Просто выстрел в темноте.

РЕДАКТИРОВАТЬ: Чтобы быть ясным, я спрашиваю, потому что я пытался сохранить экземпляр B с отметкой времени T1 и экземпляр C с отметкой времени T1, и я получил ошибку о том, что ограничение было нарушались. Я надеялся, что оба экземпляра будут спасены (возможно, это было желаемое с моей стороны). Я работаю с бэкэндом Sqlite, если это имеет значение.

1 Ответ

0 голосов
/ 10 ноября 2018

Я не думаю, что вы можете указать это поведение автоматически в Базовых данных. Но вы можете достичь этого, добавив другое свойство к объекту A, а затем наложив ограничение на комбинацию этого свойства и отметки времени.

В этом примере я добавил subtype к объекту A и указал ограничение subtype,timestamp.

enter image description here

Это классы сущностей:

class EntityA: NSManagedObject {
    @NSManaged var timestamp: String
    @NSManaged var subtype: String
}
class EntityB: EntityA { }
class EntityC: EntityA { }

Вам необходимо правильно установить subtype перед сохранением объекта:

entity.subtype = "B"

или

entity.subtype = "C"

или более обобщенно:

entity.subtype = entity.entity.name!

Это не красиво, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...