Я использую android комнату для своей базы данных: я ищу способ выполнить последовательность действий, как в следующем коде:
@Query( "CREATE TEMP TABLE IF NOT EXISTS t1 (idx INTEGER, rnd_pos INTEGER)")
fun shuffle_subquery1()
@Query("DELETE FROM t1;")
fun shuffle_subquery2()
@Query("INSERT INTO t1 SELECT song_id, RANDOM() FROM song_table WHERE playlist_id=:playlistID")
fun shuffle_subquery3(playlist_id: Int)
@Query("WITH " +
"i_rnd(idx, rnd_pos) as (SELECT r1.idx, (SELECT COUNT(*) FROM t1 as r2 WHERE r2.rnd_pos<r1.rnd_pos OR " +
" (r2.rnd_pos=r1.rnd_pos and r2.idx<r1.idx)) as rnd_pos FROM t1 as r1) " +
"UPDATE song_table SET rnd_pos=(SELECT rnd_pos FROM i_rnd WHERE song_table.song_id=i_rnd.idx) WHERE playlist_id=:playlistID"
)
fun shuffle_subquery4(playlist_id: Int)
@Transaction
fun shuffle(playlist_id: Int) {
shuffle_subquery1()
shuffle_subquery2()
shuffle_subquery3(playlist_id)
shuffle_subquery4(playlist_id)
}
Это дает ошибку error: UNKNOWN query type is not supported yet. You can use:DELETE, INSERT, SELECT, UPDATE
public abstract void shuffle_subquery1()
и There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: t1)
public abstract void shuffle_subquery2()
@Transaction
@Query(
"CREATE TEMP TABLE IF NOT EXISTS t1 (idx INTEGER, rnd_pos INTEGER);\n" +
"DELETE FROM t1;\n" +
"\n" +
"INSERT INTO t1 SELECT song_id, RANDOM() FROM song_table WHERE playlist_id=:playlistID;\n" +
"\n" +
"WITH\n" +
"i_rnd(idx, rnd_pos) as (SELECT r1.idx, (SELECT COUNT(*) FROM t1 as r2 WHERE r2.rnd_pos<r1.rnd_pos OR \n" +
" (r2.rnd_pos=r1.rnd_pos and r2.idx<r1.idx)) as rnd_pos FROM t1 as r1)\n" +
"UPDATE song_table SET rnd_pos=(SELECT rnd_pos FROM i_rnd WHERE song_table.song_id=i_rnd.idx) WHERE playlist_id=:playlistID;"
)
fun shuffle(playlist_id: Int)
Эта версия выдает ошибку: error: Must have exactly 1 query in the value of @Query or @DatabaseView
public abstract void shuffle(int playlist_id);
Каков наилучший (и работающий) способ сделать это, используя Android Комната?