Я экспериментирую с SQlite.Swift в iOS и пытаюсь случайным образом выбрать строку из таблицы в базе данных SQLite.
Таблица — movies
, а ее столбцы — movieID
, title
, genre
и seen
.
Проблема: фильмы должны выбираться случайным образом, но как только я устанавливаю seen
на «да», они больше не должны выбираться.
func randomRow() -> Int {
let path = NSSearchPathForDirectoriesInDomains(
.documentDirectory,
.userDomainMask, true)
.first!
let database = try! Connection("\(path)/movies.sqlite3")
var randomRow = Int(arc4random_uniform(UInt32(try!
database.scalar(movies.where(seen != "yes")
.select(movieID.distinct.count)))))
while previousNumber == randomRow {
randomRow = Int(arc4random_uniform(UInt32(try!
database.scalar(movies.where(seen != "yes")
.select(movieID.distinct.count)))))
}
previousNumber = randomRow
return randomRow
}
let destRow = randomRow()
Теперь я хочу использовать этот случайный номер строки, который будет получен из таблицы, чтобы вывести title
и genre
случайного фильма в let
("dispMovie" и "movieGenre") для вывода в UITextField
.
let path = NSSearchPathForDirectoriesInDomains(
.documentDirectory,
.userDomainMask, true)
.first!
let database = try! Connection("\(path)/filme.sqlite3")
for movie in try! database.prepare(
self.movies.where(
seen != "yes" && movieID == "\(destRow)")) {
dispMovie = movie[title]
movieGenre = movie[genre]
}
outputTextField.text = "\(dispMovie), \(movieGenre)"
Этот код работает нормально. Единственная проблема заключается в том, что фильмы, которые у меня есть seen
, все равно будут отображаться, потому что у меня есть этот .count
в функции случайного ряда.
Я также пытался вызвать Raw SQLite с помощью этого:
let newMovie = try! database.scalar(
"SELECT title, genre FROM movies WHERE seen != yes
ORDER BY RANDOM() LIMIT 1") as! String
outputTextField.text = newMovie
Но это отображает только название, а не жанр, и поиск жанра в дополнительной строке невозможен, потому что фильм выбирается из случайной строки. Я пытался сослаться на название фильма в коде Raw, но это приводило к сбою приложения.
Спасибо за помощь и подсказки.