私はAndroidアプリケーションでsqlite dbを使用しています。ユーザーが注文を変更したときにdbに行を並べ替えるようにします。前回保存した順番でデータを表示できるように、他のすべての行に影響するはずです。Sqlite db re-arrange row
下の画像は、私のdbを示しています。 2行目を6位に移動すると、3行目が2位、4位が3位、6位が6位になるはずです。どのようにクエリを使用してそれを行うには?
私はAndroidアプリケーションでsqlite dbを使用しています。ユーザーが注文を変更したときにdbに行を並べ替えるようにします。前回保存した順番でデータを表示できるように、他のすべての行に影響するはずです。Sqlite db re-arrange row
下の画像は、私のdbを示しています。 2行目を6位に移動すると、3行目が2位、4位が3位、6位が6位になるはずです。どのようにクエリを使用してそれを行うには?
をあなたはそれが移動されています位置他の項目から(sqliteのではない)あなたのコード内で検出することができます。その情報を使用すると、影響を受ける位置を増減するためのSQL文を作成できます。私は(擬似コード)を意味:
ユーザは、メートル
これは、私が似た何かのために私のDBで使用されるスニペットは、次のとおりです。
if(newPosition < currentPosition) {
db.rawQuery("UPDATE " + TABLE_NAME + " SET " +
Entry.COLUMN_NAME_ORDER + " = " + Entry.COLUMN_NAME_ORDER + "+1 "
+ "WHERE " + /* any additional requirements as needed */
+ Entry.COLUMN_NAME_ORDER + " BETWEEN " + newPosition + " AND " + currentPosition,
null);
} else if(newPosition > currentPosition) {
db.rawQuery("UPDATE " + TABLE_NAME + " SET " +
Entry.COLUMN_NAME_ORDER + " = " + Entry.COLUMN_NAME_ORDER + "-1 "
+ "WHERE " /* any additional requirements as needed */
+ Entry.COLUMN_NAME_ORDER + " BETWEEN " + currentPosition + " AND " + newPosition,
null);
}
それは、currentPositionとnewPosition間のすべてのエントリの場合とそうでない場合の唯一の違いを順序を変更ブロックビーイングどちらの方向、すなわち+1か-1である。これを処理する方法が良いかどうかはわかりませんが、これまでのところ私にとってはうまくいきました。
そして最後には、必須項目に移動:
ContentValues cv = new ContentValues(1);
cv.put(Entry.COLUMN_NAME_ORDER, newPosition);
db.update(TABLE_NAME, cv, Entry.COLUMN_NAME_ID + "=" + id, null);
// increment position
if (m > n) {
// move other items
executeSQL("UPDATE table_name SET list_position = list_position-1 WHERE list_position > n AND list_position <= m");
// move
executeSQL("UPDATE table_name SET list_position = m WHERE list_position = n");
}
// decrement position
else if (m < n) {
// move other items
executeSQL("UPDATE table_name SET list_position = list_position+1 WHERE list_position >= m AND list_position < n");
// move
executeSQL("UPDATE table_name SET list_position = m WHERE list_position = n");
}
実際には単一のクエリで行うことができますを配置する位置Nから項目を移動させます。実際にテーブルとカラム名をクエリに静的に書き込むと、:curpos
と:newpos
はすべての呼び出しで補間する必要があります(おそらく他の答えや、実際の文字列連結を使用します)。java.util.Formatter
インスタンス)
update :table set :col =
case
when :col < :curpos then :col + 1
when :col > :curpos then :col - 1
else :newpos
end
where :col between min(:curpos,:newpos) and max(:curpos,:newpos);
編集:私は
形式...以前のバージョンでは役に立たないラインのカップルがあったこと、それ読める –
はい@AnanthaRajuCを作るためにあなたの質問を見つけました。書式化されました...ご迷惑をおかけします。 – Humanoid
SharedPreferencesに必要な順序でフィールドリストを保存するだけです。次に、次のクエリでそのリストを使用します。結局のところ、誰が 'SELECT *'を21世紀にもう使用しようとしていますか? –