Невозможно удалить CKRecords с установленным `.parent` - PullRequest
0 голосов
/ 27 июня 2019

Я использую CloudKit Sharing и у меня проблема с удалением записей.Я создаю две записи: запись и актив.Если я установлю .parent Актива, чтобы он указывал на Элемент, то при попытке удалить как Элемент, так и Актив в одном пакете, произойдет сбой с ошибкой нарушения ссылки:

<CKError 0x600002ac2190: \"Reference Violation\" (31/2025); server message = \"Record delete would violate validating reference ([a1]), rejecting update\"

Подробности

Я создаю родительскую запись (запись) и дочернюю запись (актив) и устанавливаю для объекта .parent запись:

let eid = CKRecord.ID(recordName: "e1", zoneID: CKRecordZone.ID(zoneName: "test", ownerName: CKCurrentUserDefaultName))
let e = CKRecord(recordType: "Entry", recordID: eid)
e["title"] = "Entry"

let aid = CKRecord.ID(recordName: "a1", zoneID: CKRecordZone.ID(zoneName: "test", ownerName: CKCurrentUserDefaultName))
let a = CKRecord(recordType: "Asset", recordID: aid)
a["position"] = 1
a.setParent(e)

Затем я сохраняю оба в одном и том же вызове:

let op = CKModifyRecordsOperation(recordsToSave: [e,a], recordIDsToDelete: nil)
op.modifyRecordsCompletionBlock = { (records, recordIDs, error) in
  print("Returned from modify")
  print("records: \(records)")
  print("error: \(error)")
}
CKContainer.default().privateCloudDatabase.add(op)

Операция успешно завершается, и записи правильно создаются в CloudKit.

Но, когда я пытаюсь удалить оба:

let op = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: [eid, aid])
op.modifyRecordsCompletionBlock = { (records, recordIDs, error) in
  print("Returned from modify")
  print("records: \(records)")
  print("deleted: \(recordIDs)")
  print("error: \(error)")  
}
CKContainer.default().privateCloudDatabase.add(op)

Я получаю вышеуказанную ошибку.

Обходной путь

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

I 'Мы также обнаружили, что если я добавлю другое поле в запись актива, которое ссылается на запись с действием .deleteSelf, это все работает.Итак, в приведенном выше коде, где я создаю Актив, если я добавлю следующее (при удержании вызова setParent():

a["entryRef"] = CKRecord.Reference(record: e, action: .deleteSelf)

Тогда все работает правильно.

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

Кто-нибудь сталкивался с этим или нашел способ обойти это без необходимости в дополнительном поле ссылки? Использование CKRecord.References накладывает ограничение в 750 ссылок на родителя, и я бы предпочел не иметь этого ограничения.

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