Начиная с iOS 11 , вы можете использовать собственный фреймворк под названием PDFKit для отображения и управления PDF-файлами.
После импорта PDFKit вы должны инициализировать PDFView
локальным или удаленным URL-адресом и отобразить его в своем представлении.
if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") {
let pdfView = PDFView(frame: view.frame)
pdfView.document = PDFDocument(url: url)
view.addSubview(pdfView)
}
Вам необходимо реализовать это вручную, найдя затронутые записи и удалив их одновременно с удалением родительской записи. Вы можете упростить это, если хотите, переопределив метод .delete () в родительском классе для автоматического удаления всех связанных записей.
По соображениям производительности вы почти наверняка захотите использовать запросы только по ключу (что позволит вам получить ключи сущностей, которые должны быть удалены без необходимости извлечения и декодирования фактических сущностей), и пакетное удаление. Например:
db.delete(Bottom.all(keys_only=True).filter("daddy =", top).fetch(1000))
На самом деле это поведение зависит от GAE. ORM Django имитирует "КАСКАД УДАЛЕНИЯ" на .delete ().
Я знаю, что это не ответ на ваш вопрос, но, возможно, он поможет вам не искать в неправильных местах.
If your hierarchy is only a small number of levels deep, then you might be able to do something with a field that looks like a file path:
daddy.ancestry = "greatgranddaddy/granddaddy/daddy/"
me.ancestry = daddy.ancestry + me.uniquename + "/"
sort of thing. You do need unique names, at least unique among siblings.
The path in object IDs sort of does this already, but IIRC that's bound up with entity groups, which you're advised not to use to express relationships in the data domain.
Then you can construct a query to return all of granddaddy's descendants using the initial substring trick, like this:
query = Person.all()
query.filter("ancestry >", gdaddy.ancestry + "\U0001")
query.filter("ancestry <", gdaddy.ancestry + "\UFFFF")
Obviously this is no use if you can't fit the ancestry into a 500 byte StringProperty.