2017-01-27 6 views
-1

私はAndroidアプリケーションでsqlite dbを使用しています。ユーザーが注文を変更したときにdbに行を並べ替えるようにします。前回保存した順番でデータを表示できるように、他のすべての行に影響するはずです。Sqlite db re-arrange row

下の画像は、私のdbを示しています。 2行目を6位に移動すると、3行目が2位、4位が3位、6位が6位になるはずです。どのようにクエリを使用してそれを行うには?

screenshot

+0

形式...以前のバージョンでは役に立たないラインのカップルがあったこと、それ読める –

+0

はい@AnanthaRajuCを作るためにあなたの質問を見つけました。書式化されました...ご迷惑をおかけします。 – Humanoid

+0

SharedPreferencesに必要な順序でフィールドリストを保存するだけです。次に、次のクエリでそのリストを使用します。結局のところ、誰が 'SELECT *'を21世紀にもう使用しようとしていますか? –

答えて

0

をあなたはそれが移動されています位置他の項目から(sqliteのではない)あなたのコード内で検出することができます。その情報を使用すると、影響を受ける位置を増減するためのSQL文を作成できます。私は(擬似コード)を意味:

ユーザは、メートル

+0

ありがとうございます..それは良い.... ....-) – Humanoid

+0

同じアプリケーションで**スワイプ**と複数のボタンを表示するListViewも**ドラッグ**任意の場所へのアイテム。私は別々のファイルでそれらを試しましたが、私はできないファイルを統合しようとしています。単一のライブラリでこれを解決する簡単な方法はありますか? – Humanoid

+0

正直言って、それを実行するライブラリがあるかどうかはわかりません。しかし、解決策が見つからない場合は、新しい質問をすることをお勧めします。 – adalPaRi

0

これは、私が似た何かのために私の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); 
+0

ここで** Entry **は何を意味しますか?今、私はsqlite DB_Browserを使っています。 – Humanoid

+0

@ 1992 Entryは静的な最終ストリングとしてクラス名を保持し、BaseColumnsを実装する静的なネストされたクラスです。あなたが望むなら、列名をハードコードすることができます – Luke

+0

ありがとう@ルーク..それを試してみてください... – Humanoid

0
// 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); 

編集:私は