Я использую 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 ссылок на родителя, и я бы предпочел не иметь этого ограничения.