2017-01-27 1 views
-1

내 안드로이드 응용 프로그램에서 sqlite db를 사용하고 있으며 사용자가 순서를 변경할 때 db가 행을 다시 정렬하기를 원합니다. 마지막으로 저장 한 순서대로 데이터를 표시 할 수 있도록 다른 모든 행에 영향을 주어야합니다.Sqlite db 다시 정렬 행

아래 이미지는 내 DB를 보여줍니다. 2 번째 줄을 6 번째 줄로 움직이면 3 번째 줄은 2 위, 4 위는 3 위, 6 위까지 이어집니다. 쿼리를 사용하여이를 수행하는 방법?

screenshot

+0

형식으로 ... 이전 버전에 쓸모 라인의 몇 가지가 있다고 그것을 읽을 수 –

+0

예 @AnanthaRajuC를 만들기 위해 질문을 발견했다. 형식이 잘못되었습니다. 불편을 끼쳐 드려 죄송합니다. – Humanoid

+0

SharedPreferences에서 원하는 순서로 필드 목록을 저장하기 만하면됩니다. 그런 다음 다음 쿼리에서 해당 목록을 사용하십시오. 결국 누가 21 세기에'SELECT *'를 사용할 것인가? –

답변

0

당신은 당신의 코드를 다른 항목이 이동 한 것 할 수있는 위치에서 (하지 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"); 
} 
+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

여기에 ** 항목 **이 무엇을 의미합니까? 이제 sqlite DB_Browser를 사용해 보려고합니다. – Humanoid

+0

@ 1992 Entry는 클래스 이름을 static final String으로 유지하고 BaseColumns를 구현하는 정적 중첩 클래스입니다. 만약 당신이 원하는 경우 열 이름을 하드 코드 할 수 있습니다 – Luke

+0

고마워요 @ 루크 .. 그것을 시도하고 알게 ... – Humanoid

0

이 하나의 쿼리를 수행 할 수 있습니다에게 위치를 위치 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); 

편집 : 나는