詳しくないので、解釈から間違っている可能性もありそうなのですが、こういうやり方では解決にならないでしょうか?
課題
テーブルtextsに対する下記の処理をSQLで記述します。
処理前
| _id |
text |
created_at |
position |
isChecked |
| 4 |
s |
2020-10-28 13:35:35 |
0 |
1 |
| 6 |
a |
2020-10-28 13:35:46 |
4 |
1 |
| 7 |
k |
2020-10-28 13:50:33 |
2 |
0 |
処理後
| _id |
text |
created_at |
position |
isChecked |
| 4 |
s |
2020-10-28 13:35:35 |
0 |
1 |
| 6 |
a |
2020-10-28 13:35:46 |
2 |
1 |
| 7 |
k |
2020-10-28 13:50:33 |
1 |
0 |
課題の意味
position列の昇順に、0で始まる連番を振り直します。
考察
UPDATE texts AS m SET position = (
SELECT COUNT(*) - 1 FROM texts
WHERE position <= m.position
);
このSQL文はエラーせずに完了しますが、課題は達成できず、position列は0, 2, 2になります。
これは、条件に使用してるテーブル(m)を書き替えてしまうためです。
ソートしたテーブルを更新することで回避できれば良いのですが、SQLiteではUPDATEにORDER BYが使えないという問題が立ち塞がるわけですね。
一応の解決
少々トリッキーな方法ですが、テーブルにカラムtempを追加した上で、以下のSQLを実行するというのはいかがでしょうか。
UPDATE texts AS m SET temp = (
SELECT COUNT(*) - 1 FROM texts
WHERE position <= m.position
);
UPDATE texts SET position = temp;