2013-03-09 3 views
7

키가 이미있는 경우 IndexedDB objectStore에 개체 추가가 실패합니다. 주어진 키를 가진 객체의 존재를 확인하는 방법 - 바람직하게는 동기식 (콜백의 다른 층을위한 이유 없음)과 객체를 당기지 않고.IndexedDB objectStore에 이미 키가 포함되어 있는지 확인하십시오.

트랜잭션을 통해 요청을 비동기 적으로 가져 오는 방법을 알고 있지만 객체를 추가 할 때마다 약간의 시련이 따르는 것 같습니다.

참고 솔루션은 (즉, 도움이된다면)

답변

6

지금까지 싱크 API를 구현 한 브라우저가 없었기 때문에 비동기로해야했습니다. objectStore은 키를 제공하는 get 메서드를 제공하며 키와 일치하는 개체 (또는 null)를 반환합니다.

IDB를 사용하여 커버 MDN에 정말 좋은 튜토리얼있다

getting a record도 포함되어 있지만 인라인 코드는 다음과 같습니다 그런 다음 레코드를 검색하지 않으려면

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) { 
    alert("Name for SSN 444-44-4444 is " + event.target.result.name); 
}; 

는 항상 사용할 수 있습니다 count 색인에 대한 설명은 here in the spec입니다. 그 결과에 따라 add 또는 put을 사용하여 레코드를 수정할 수 있으며, 필요하지 않으면 레코드 추출을 절약 할 수 있습니다.

+0

이상적으로는 레코드를 가져 와서 초기화하지 않을 것입니다 (오브젝트 중 일부는 중첩 된 데이터가 많이 있습니다). SQL의 존재와 비슷한 것을 찾고있다.indexedDB가 SQL 기반이 아니라는 것을 알지만 Redis와 같은 다른 키 - 값 저장소는 키의 존재를 확인하기 위해 지원합니다. – Chris

+0

@Chris - 아니요. 그런 식의 메서드가 없습니다. 다른 옵션을 추가했습니다. 그 물체를 수화 시키려고하지 마라. –

+0

그런데 나는 그것이 haha를 바랐던 방법으로 대답한다. 고맙습니다! – Chris

10

키의 존재를 확인하는 가장 좋은 방법은 objectStore.count (키)입니다 크롬에서 작동한다. 어떤 비동기입니다.

귀하의 경우에 가장 적합한 옵션은 키의 openCursor입니다. 커서가 있으면 커서가 나타납니다.

var req = objectStore.openCursor(key); 
req.onsuccess = function(e) { 
    var cursor = e.target.target; 
    if (cursor) { // key already exist 
    cursor.update(obj); 
    } else { // key not exist 
    objectStore.add(obj) 
    } 
}; 
+2

그래, 내가 원하는 것에 가장 가까운 것 같다. 약속을 쌓아 라! – Chris

1

질문은 왜 이것을 알고 싶습니까? 어쩌면 다른 접근법을 사용해야할까요?

자동 증가 기능을 사용하면 키가 있는지 확인할 필요가 없으므로 항상 고유 한 키를 얻을 수 있습니다.

add 메소드 대신 put 메소드를 사용할 수도 있습니다. put을 사용하면 키가있는 경우 데이터가 업데이트되고 키가 존재하지 않으면 데이터가 추가됩니다.

모든 것이 있는지 여부를 확인하려는 이유에 따라 다릅니다.

+0

설치시 JSON을 데모 데이터로로드하는 응용 프로그램을 빌드 중이므로 테스트 및 일부 경우에는 설치 콜백이 여러 번 실행되므로 데모 데이터가 실제로 이미 존재합니다 (indexedDB가 지워지지 않음). – Chris

+0

그래서이 경우 put 메서드를 사용할 수 있습니다. 기존 데이터를 덮어 쓰고 새 데이터를 추가합니다. –

+1

좋아요. 매우 구체적인 경우에는 작동하지만 존재 여부를 확인하는 것과는 다릅니다. 그것은 단지 DB에 데이터를 강제하는 것입니다. 데이터를 꺼내거나 업데이트하지 않고 레코드의 존재 여부를 확인하려는 사람이 있다고 생각할 수도 있습니다. – Chris

2

답변에 조금 늦었지만 다른 사람들에게 도움이 될 수 있습니다. 나는 아직도 내가 같은 문제를 통해 guess-하지만 아주 간단 -as 발견 :

삽입하거나 당신은 단지 당신이 objectStore.add(object)(help)

을 사용하여 레코드를 삽입하려면 UPDATE 기록 당신이 objectStore.put(object) (help)
를 사용하려는 경우

따라서 add(object)을 사용하고 레코드 키가 DB에 여전히 존재하면 덮어 쓰지 않고 "ConstraintError : Key가 오브젝트 저장소에 이미 존재합니다"라는 오류 0을 발생시킵니다.

put(object)을 사용하면 덮어 씁니다.

관련 문제