2012-04-08 7 views
1

간단한 메모장 응용 프로그램을 만들어 IndexedDB의 기초를 배우려고합니다. 이 환경에서 정렬 된 목록을 사용하는 데 어려움이 있습니다.IndexedDB에서 정렬 된 목록 사용

구현 방법을 잘 모르는 기능은 정렬 된 메모 목록을 갖는 것입니다.

내가 처음 WebSQL에서 메모장 응용 프로그램을 구현했는데, 나는 그것을 아주 쉽게이 같은 메모를 선택 발견 : 지정한 위치에 메모를 삽입 할 때

select * from notes order by position 

을 그리고, 내가 먼저했다 ...

update notes set position = position + 1 where position >= insert_position 

는 ... 위치 insert_position에서 새 메모를위한 공간을 확보하기 위해 각 메모를 이동합니다.

하지만 WebSQL은 실제로 사용되지 않습니다.

IndexedDB에서 이러한 기능을 구현하기위한 가능성은 무엇입니까? 위와 같은 빠른 쿼리를 적용 할 수 없기 때문에 IndexedDB와 같은 환경에서 정렬 된 목록을 만드는 방법을 완전히 이해하지 못합니다.

부수적으로, IndexedDB에 배열을 저장할 수 있다는 것을 알고 있지만 매번 한 번 사용하는 레코드가 하나뿐입니다. 차라리 어떻게 든 모든 레코드 (각 레코드가 노트를 나타냄)의 정렬 된 목록을 갖고, 위의 시프트 쿼리와 같이 순서를 업데이트 할 수있는 방법을 찾고 있습니다.

누군가가 색인 된 목록의 IndexedDB 방식에 대해 설명해 줄 수 있습니까?

답변

2

많은 것들과 마찬가지로이 너트를 부수기위한 몇 가지 방법이 있습니다.

작성 시간에 따라 메모를 주문하는 앱을 만드는 경우 자동 증가 키를 사용하는 것처럼 간단합니다 (이 플래그는 objectStore 작성시 지정됨). 하나는 id (일명 primaryKey)이 1이고, 두 번째가 2 일 것입니다. 기본 값은 keyPath이므로 색인을 만들 필요없이 커서를 열 수 있습니다.

시간에 맞게 수정하는 등 변경 될 수있는 메모를 주문하려면 해당 필드에 색인을 만들고 adding 또는 putting 개체 일 때 지정해야합니다. lower bound가있는 커서를 여는 경우, 예를 들어 0 (사전 식 키는 모든 문자열 앞에 있음을 의미 함)을 열고 위쪽 경계를 열어 둡니다. 그런 다음 커서를 다 쓸 때까지 onsuccess 핸들러를 하나씩 실행하여 각 행에 커서를 놓고 event. target.result에 null을 반환합니다.

"위치"와 같은 분야를 찾고있을 수도있는 것처럼 들릴 수도 있습니다. 위와 같이 정규 색인과 커서를 사용하면 완전히 수행 할 수 있습니다. 하나의 조언은 position 필드를 부동 소수점 숫자로 정수가 아닌 정수로 만드는 것입니다. 다른 행 (position n = ((position 1 + position 2)/2))을 변경하지 않고 순서를 업데이트 할 수 있습니다.

+0

도움을 주셔서 감사합니다. 부동 소수점 아이디어 나에게 새로운이며 아주 재미있는 것, 감사합니다! – pimvdb