Атрибут CKReference .DeleteSelf не действует

Как на самом деле работает .DeleteSelf? Документы говорят:

Когда для действия объекта ссылки задано значение CKReferenceActionDeleteSelf, цель ссылки, то есть запись, хранящаяся в свойстве recordID ссылки, становится владельцем исходной записи. Удаление целевой записи (владельца) приводит к удалению всех ее исходных записей.

но у меня сложилось впечатление, что удаление цели не всегда приводит к удалению источника. И совсем напрягает, когда он остается в контейнере, клиент его скачивает и ожидает, что точка отсчета куда-то, а target не существует при наращивании слайса серверного хранилища данных на клиенте?

Как вы относитесь к этому случаю? Вы игнорируете такие записи? Или вы периодически просматриваете хранилище CloudKit в поисках поврежденных записей, чтобы удалить их?

Или вместо удаления записи лучше установить атрибут, что она в удаленном состоянии, но оставить в базе?


person János    schedule 25.09.2015    source источник
comment
Вы должны иметь возможность полагаться на .DeleteSelf. Если это не работает, вам следует создать отчет об ошибке на bugreport.apple.com. Если вы хотите создайте обходной путь для этой ошибки, и поскольку вы контролируете то, что происходит в момент удаления записи, я думаю, что было бы лучше также вручную удалить все связанные записи в тот же момент.   -  person Edwin Vermeer    schedule 27.09.2015
comment
Я также вижу прерывистое поведение с .DeleteSelf   -  person Michael Waterfall    schedule 27.10.2015
comment
Я сталкиваюсь с этой проблемой. У меня есть несколько таблиц с отношением «один ко многим» к главной таблице. В общедоступную базу данных я добавляю основную запись, а затем некоторые записи в другие таблицы. Если все это делается одним пользователем, и другие пользователи даже не обращаются к данным, то удаление основной записи приводит к тому, что все другие записи удаляются, как и ожидалось. Но как только другой пользователь получает доступ к данным, каскадное удаление не происходит, и удаляется только основная запись. Кажется бессмысленным, если вы не можете рассчитывать на эту функцию.   -  person rmaddy    schedule 28.04.2016


Ответы (2)


Я просто боролся с этим некоторое время, и я решил поделиться своими выводами...

Это в основном вопрос разрешения. Каскадное удаление будет работать только в том случае, если пользователь, удаляющий записи, имеет права «записи» для всех записей, которые необходимо удалить. Таким образом, на панели инструментов CloudKit каскадное удаление будет работать только для записей, созданных с помощью учетной записи iCloud разработчика.

Если вам нужно удалить записи, которые не принадлежат удаляющему их пользователю, вы можете добавить разрешения на запись для типа записи в разделе «Безопасность».

введите здесь описание изображения

person Yann Bodson    schedule 27.07.2016
comment
Мои записи находятся в той же зоне, созданной тем же пользователем, и ссылки по-прежнему не удаляются. Я думаю, что это ошибка в панели инструментов CloudKit. И да, это все еще происходит в конце 2017 года. :) - person Clifton Labrum; 07.09.2017

Если вы удаляете через CloudKit Dashboard, вам нужно подождать, прежде чем переключать типы записей, чтобы проверить другой конец ссылки. Скорее всего, вы переключились до того, как действительно произошло удаление. Вы можете использовать веб-инспектор Safari на вкладке «Сеть», чтобы проверить, когда удаление действительно завершилось. Удаление нескольких записей занимает очень много времени.

person malhal    schedule 05.04.2016