2011-11-24 6 views
4

대부분의 turorial에는 커서로 반복하여 객체 저장소에서 모든 레코드를 검색하는 방법이 나와 있습니다. 그러나 키 "myKey"를 사용하여 객체 저장소에서 값을 검색하는 방법은 무엇입니까?Html5 IndexedDB - 키를 사용하여 값 검색

답변

5

간단한 키/값 저장을 원할 경우 localStorage을 고려할 수 있습니다. IndexedDB를 사용하는 것보다 훨씬 간단합니다. 문자열 (지금까지)에서만 작동하지만 객체는 JSON 객체를 통해 쉽게 문자열 화됩니다.

console.log('BEFORE', localStorage.getItem('test-key')); 
localStorage.setItem('test-key', JSON.stringify({ 'foo': Math.round(Math.random() * 1000) })); 
console.log('AFTER', JSON.parse(localStorage.getItem('test-key'))); 

당신이 키의 키 또는 범위에 대해 여러 값을 얻을 필요가있는 경우에만, 색인화의 핵심에서 단일 값을 얻기 위해 커서를 필요로하지 않습니다 말했다. myKey 가게를 만들 때()에 추가하여 기본 키

1) 경우 : 키에서 값을 얻으려면, 당신은 두 가지 중 하나를 할

var request = transaction.get(key); 

당신은 다음 추가 할 수 onsuccessonerror 콜백을 사용하여 event.target.result 값을 추출 할 결과 이벤트 객체를 구문 분석합니다.

2) myKey이 기본이 아닌 색인 (상점을 만든 후 추가 한 색인)에있는 경우 거래에서 색인을 연 다음 색인에서 커서를여십시오. (같은 키에 저장된 여러 값을 가질 때마다 일을해야하기 때문에 가능성이 더 자주 논의 참조) 커서에 관해서는

var transaction_index = transaction.index(index); 
var request = transaction_index.get(key); 

, 당신은뿐만 아니라 하나의 키 값을 검색하는 사람들을 사용할 수 있습니다. the spec 말한다 :

A key range may consist of a single value.

당신은 IDBKeyRange 개체를 사용하여 keyRange을 생성해야합니다. 다음은 MIT-licensed InDB (내 작업 중 IndexedDB wrapper)의 도우미 메소드로, 단일 값 (예 : InDB.range.get(value)) 또는 키 범위에서 커서를 여는 작업을 처리합니다. 당신이 keyRange이 있으면

InDB.range.get = function (value, left_bound, right_bound, includes_left_bound, includes_right_bound) { 
     if (InDB.exists(left_bound) && InDB.exists(right_bound) && InDB.exists(includes_left_bound) && InDB.exists(includes_right_bound)) { 
      return IDBKeyRange.bound(left_bound, right_bound, includes_left_bound, includes_right_bound); 
     } else if (InDB.exists(left_bound) && InDB.exists(includes_left_bound)) { 
      return IDBKeyRange.lowerBound(left_bound, includes_left_bound); 
     } else if (InDB.exists(right_bound) && InDB.exists(includes_right_bound)) { 
      return IDBKeyRange.upperBound(right_bound, includes_right_bound); 
     } else if (InDB.exists(value)) { 
      return IDBKeyRange.only(value); 
     } else { 
      return false; 
     } 
    } 

, 당신은 두 가지 중 하나를 수행합니다 myKey 가게를 만들 때 추가 된 기본 키()이다

1) 경우에, 당신은 당신의 거래에 정기적 커서를 열어 (선택적 방향으로). myKey가 (기본이 아닌 인덱스에 당신이 가게를) 만든 후 추가 한 하나의 경우

var request = transaction.openCursor(keyRange, direction); 

2), 당신은 당신의 거래에 인덱스를 열고 인덱스에 커서를 엽니 다.

var transaction_index = transaction.index(index); 
var request = transaction_index.openCursor(keyRange, direction); 
+0

"var request = transaction.get (key);" 오류가 발생합니다 : "Uncaught TypeError : Object # 에는 'get'메서드가 없습니다. 난 당신이 작성한대로 트랜잭션이 아닌 objectStore에 .get() 메서드를 호출해야한다고 생각합니다. 그게 맞습니까? – Matthew

+0

트랜잭션을 통해 객체 저장소 데이터에만 액세스 할 수 있지만'objectStore'에서'get()'을 호출하는 것이 옳습니다. 'transaction'에 대한 var 선언은 여기에 표시되지 않지만'event.objectStore (database)'와 같을 것입니다. – buley

+0

주목할만한 점은 데이터베이스 (http://www.w3.org/TR/IndexedDB/#idl-def-IDBDatabase)의 'var event = database'에서 트랜잭션을 여는 것입니다.트랜잭션 ([database], type, timeout); – buley