Обновлено для Swift 4 Воспроизведение из основного комплекта - только для iOS 11
import AVFoundation
var player: AVAudioPlayer?
Следующий код загружает звуковой файл и воспроизводит его, возвращая при необходимости ошибку.
guard let url = Bundle.main.url(forResource: "test", withExtension: "m4a") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
guard let player = player else { return }
player.play()
} catch let error {
// Prints a readable error
print(error.localizedDescription)
}
Записи, указывающие на другие записи, полезны в базе данных. Иногда эти записи образуют цикл. Это все еще может быть полезно. Единственное, что действительно раздражает на практике, - это избегать нарушения ограничений.
Например, если у вас есть таблица пользователей и транзакций, у пользователя может быть указатель на свою последнюю транзакцию. Сначала необходимо вставить транзакцию, а затем обновить last_transaction_id
до правильного значения. Пока существуют обе эти записи, вы не можете их стереть, потому что user.last_transaction_id
указывает на transaction.id
, а transaction.user_id
указывает на пользователя .id
. Это означает, что пользователь без транзакций имеет нулевой last_transaction_id
. Это также означает, что вы должны обнулить это поле, прежде чем сможете удалить транзакцию.
Управление этими ограничениями внешнего ключа - это боль, но, безусловно, возможно. Могут возникнуть проблемы, если позже вы добавите в базу данных ограничения, которые вводят новые циклические зависимости. В этой ситуации нужно быть осторожным. Однако, пока одна из записей в цикле имеет поле внешнего ключа, допускающее значение NULL, цикл может быть прерван, а записи могут быть удалены. Обновление обычно не является проблемой, если вы вставляете записи в правильном порядке.
если одна из записей в цикле имеет поле внешнего ключа, допускающее значение NULL, цикл может быть прерван, а записи могут быть удалены. Обновление обычно не является проблемой, если вы вставляете записи в правильном порядке. если одна из записей в цикле имеет поле внешнего ключа, допускающее значение NULL, цикл может быть прерван, а записи могут быть удалены. Обновление обычно не является проблемой, если вы вставляете записи в правильном порядке.Это технически возможно, но это может вызвать всевозможные проблемы при удалении записей, поскольку создает проблемы с курицей и яйцом. Эти проблемы часто требуют радикальных действий, таких как удаление FK вручную и удаление проблемных элементов для решения.
Если у вас есть такие отношения, как:
create table foo_master (
foo_master_id int not null primary key
,current_foo_id int
)
create table foo_detail (
foo_detail_id int not null primary key
foo_master_id int not null
)
alter table foo_master
add constraint fk_foo_current_detail
foreign key (current_foo_id)
references foo_detail
alter table foo_detail
add constraint fk_foo_master
foreign key (foo_master_id)
references foo_master
Тогда удаление записи может вызвать такую проблему из-за циркуляра зависимости.
Лучшая схема для этого выглядит так:
create table foo_master (
foo_master_id int not null primary key
)
create table foo_detail (
foo_detail_id int not null primary key
foo_master_id int not null
is_current char (1)
)
alter table foo_detail
add constraint fk_foo_master
foreign key (foo_master_id)
references foo_master
Это означает, что связь нециклическая и «текущая» запись foo_detail все еще может быть идентифицирована.
Одно из последних дополнений к синтаксису иерархических запросов Oracle - ключевое слово NOCYCLE
- было сделано специально для этой цели - для работы с циклическими ссылками в данных. Я не вижу в этом ничего плохого, и раньше мне приходилось иметь дело с такой моделью. Это не так уж сложно, особенно в Oracle, который поддерживает отложенные ограничения.
Circular references should be avoided like the plague. It is possible to set up two way relationships, or even relationships to yourself (if you were a table that is), but a circular dependency is just asking for trouble.
Я видел циклические ссылки, сделанные из соображений производительности. Однако это выглядит некрасиво, и производительность может быть незначительной.
Пример: на некоторых досках объявлений (я думаю, что это делает phpBB) есть lastpostid в таблице категорий, который является ярлыком к последнему сообщению в цепочке.
Это создает круг, где последнее сообщение имеет FK для таблицы категорий, а таблица категорий имеет FK обратно к последнему сообщению.
Как я уже сказал, мне это не очень нравится, но я видел, как это было .
редко я сталкиваюсь с необходимыми отношениями 1: 1, которые накладывают циклические отношения
, обратите внимание, что поля внешнего ключа в таких отношениях должны допускать значение NULL, иначе вы никогда не сможете удалить строки из таблиц
Думаю, это не проблема, если вы используете базу данных только для записи. Если вы планируете использовать часть RUD в CRUD, вы