私はiOSでSQlite.Swiftを試していますが、SQLiteデータベースのテーブルからランダムに行を選択しようとしています。SQLite.Swiftランダムな行を繰り返さない方法
テーブルが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()
は今、私はUITextField
に出力するlet
(「dispMovie」と「movieGenre」)にランダム映画のtitle
とgenre
をリードし、テーブルからcatchedされるように、このランダムな行番号を使用します。
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
を持っているので、まだ再生されているということです。
私も、このいずれかで生の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コードで映画のタイトルを参照しようとしましたが、それはアプリをクラッシュさせます。
ご協力ありがとうございます。
今日のテストセッションから少し確認:このコードを150回映画で3回テスト(3 * 150、3つの映画;-))しないでください。すべてうまく動作します。 「見た」映画は再び表示されませんでした。 – Aeger