Основные правила удаления данных - PullRequest
3 голосов
/ 03 января 2012

В моей базе 3 объекта: фотографии, места (где делаются фотографии) и теги (фотографий).

database

Каждая фотография имеет отношение к месту, в котором она была сделана. Каждое место имеет набор фотографий, сделанных в нем.

Каждая фотография имеет набор тегов, и каждый тег имеет набор фотографий. Это отношение «многие ко многим», поскольку одна фотография может иметь несколько тегов, а тег может быть связан с несколькими фотографиями.

Теперь я не могу понять правильные правила удаления для этого поведения:

  • Я хочу напрямую удалить только фото объекты.
  • Если на соответствующем месте сделаны другие фотографии, его не следует удалять. Если фотография была последней для этого места, ее следует удалить.
  • Если соответствующие теги появляются на других фотографиях, их не следует удалять до тех пор, пока не будут связаны другие фотографии.
  • Кроме того, в сущности тега у меня есть атрибут, который отслеживает количество фотографий, связанных с ним (я обновляю этот атрибут, когда добавляю новые фотографии и также в prepareForDeletion фотографии).

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Во-первых, тегу не нужно иметь отдельный атрибут для отслеживания количества фотографий. Вы можете запросить отношения для этого количества.

Во-вторых, вы хотите установить -prepareForDeletion в объекте Photo, который проверяет, является ли это единственная фотография со ссылкой на тег, а затем удаляет ее, если это правда.

Аналогично, когда вы удаляете фотографию, в ее -prepareForDeletion вы можете проверить, сколько фотографий находится в этом месте, и задействовать ту же логику.

В самой модели я бы тогда установил правило удаления равным нулю.

1 голос
/ 05 января 2012

Итак, спасибо Маркусу, я установил все правила удаления на Nullify, а затем написал этот код в prepareForDeletion:

- (void)prepareForDeletion
{    
    //tag check: if this photo was the last associated with that tag, deletion !!
    for (Tag *tag in self.tags) {
        if ([tag.taggedPhotos count] == 1) {
            [self.managedObjectContext deleteObject:tag];
        } else {
            tag.photoCount = [NSNumber numberWithInt:[tag.photoCount intValue]-1];
        }
    }

    //place check: if this photo was the last associated with that place, deletion !!
    if ([self.whereTaken.photos count] == 1) {
        [self.managedObjectContext deleteObject:self.whereTaken];
    }
}

.1006 * атрибут, так как я использую его для сортировки тегов.

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