내 안드로이드 응용 프로그램에서 sqlite db를 사용하고 있으며 사용자가 순서를 변경할 때 db가 행을 다시 정렬하기를 원합니다. 마지막으로 저장 한 순서대로 데이터를 표시 할 수 있도록 다른 모든 행에 영향을 주어야합니다.Sqlite db 다시 정렬 행
아래 이미지는 내 DB를 보여줍니다. 2 번째 줄을 6 번째 줄로 움직이면 3 번째 줄은 2 위, 4 위는 3 위, 6 위까지 이어집니다. 쿼리를 사용하여이를 수행하는 방법?
내 안드로이드 응용 프로그램에서 sqlite db를 사용하고 있으며 사용자가 순서를 변경할 때 db가 행을 다시 정렬하기를 원합니다. 마지막으로 저장 한 순서대로 데이터를 표시 할 수 있도록 다른 모든 행에 영향을 주어야합니다.Sqlite db 다시 정렬 행
아래 이미지는 내 DB를 보여줍니다. 2 번째 줄을 6 번째 줄로 움직이면 3 번째 줄은 2 위, 4 위는 3 위, 6 위까지 이어집니다. 쿼리를 사용하여이를 수행하는 방법?
당신은 당신의 코드를 다른 항목이 이동 한 것 할 수있는 위치에서 (하지 sqlite가)에서 검색 할 수 있습니다. 이 정보를 사용하면 SQL 문을 작성하여 영향을받는 위치를 증가 또는 감소시킬 수 있습니다.
사용자가 m 사실
// 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");
}
정말 고마워요 .. 좋은 .... :-) – Humanoid
동일한 응용 프로그램에서 ListView와 ** 스 와이프 **뿐만 아니라 여러 개의 버튼을 표시하려면 ** 드래그 ** ** 어떤 장소로 항목을. 나는 그것들을 개별 파일들로 시도했지만 내가 할 수없는 파일들을 통합하려 할 때. 단일 라이브러리로이를 해결할 수있는 간단한 방법이 있습니까? – Humanoid
솔직히 말해서, 그것을 수행하는 라이브러리가 있는지 모르겠습니다. 그러나 당신이 어떤 해결책을 찾지 못한다면 나는 새로운 질문을하는 것이 더 낫다고 생각합니다. – adalPaRi
이것은 내가 비슷한 내 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);
이 하나의 쿼리를 수행 할 수 있습니다에게 위치를 위치 N에서 항목을 이동 : 나는 (의사)을 의미한다. 실제로는 :table
과 :col
을 보간하여 실제 테이블과 열 이름을 쿼리에 정적으로 쓰는 반면, :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에서 원하는 순서로 필드 목록을 저장하기 만하면됩니다. 그런 다음 다음 쿼리에서 해당 목록을 사용하십시오. 결국 누가 21 세기에'SELECT *'를 사용할 것인가? –