2014-01-28 17 views
4

저는 조금 전에 IndexedDB를 사용해 왔습니다. 새 데이터베이스를 성공적으로 생성하고 저장소를 만들고 "업그레이드 필요"중에 값을 추가 할 수 있습니다. 내가 이해하지 못하는 것은 데이터베이스가 "열린 상태"로 남아 있습니까? 아니면 데이터베이스의 정보를 읽고 쓸 수있는 액세스가 필요한 모든 기능을 다시 열어야합니까?indexedDB에서 여러 데이터베이스 연결을 여는 것이 좋지 않습니까?

예를 들어, 여기에 새 데이터베이스를 만들고, 하나 개의 레코드를 삽입 (작동) 내 코드입니다 :

나를 혼란입니다 원인을
$(document).ready(function() { 

var db; 

function initDB() { 
    console.log("opening db..."); 

    var req = indexedDB.open(dbName, version); 
    req.onsuccess = function(event) { 
     db = this.result; 
     console.log("opening db is done"); 
    } 

    req.onerror = function(event) { 
     console.log("error opening db: ", event.target.errorCode); 
    } 

    req.onupgradeneeded = function(event) { 
     db = event.target.result; 
     var store = db.createObjectStore("creds", { autoincrement: true }); 
     store.add({ username:'none', password:'none'}, 1); 
    } 
    } 

, 내가 그 데이터베이스의 레코드에 액세스해야하는 경우, 또는 레코드를 추가하거나 레코드를 삭제하면 새로운 함수를 만들고 일부 값을 삽입 할 수 있다고 생각했습니다. 이것은 내가 (실패한)가 무엇 :

function saveCreds() { 
    usr = $("#username").val(); 
    psw = $("#password").val(); 

    $.getJSON(baseURL + "cred-check/?callback=?", { username:usr, password:psw }, function(data) { 
     if (data.creds_good == 'true'); { 
     // NEXT LINE FAILS 
     var store = db.transaction(['creds'], 'readwrite').objectStore('creds'); 
     var request = store.get(1); 
     request.onsuccess = function (event) { 
      var data = request.result; 
      data.username = usr; 
      data.password = psw; 

      var requestUpdate = store.put(data, 1); 
      requestUpdate.onerror = function(event) { 
      console.log("error putting value..."); 
      } 
     } 
     } 
    }); 
    } 

saveCredsinitDB 기능은 $(document).ready() 함수 내이며 db 변수는initDBsaveCreds 기능 외부 을 선언하지만, 그래서 내부의 $(document).ready() 내 범위는 괜찮다고 생각합니다.

문제는 db 변수가 정의되지 않았기 때문입니다. 오류 : Cannot call method "transaction" of undefined가 표시됩니다.

데이터베이스의 데이터에 액세스해야하는 모든 함수에 대해 데이터베이스를 다시 조작하여 변수를 재 할당해야 데이터베이스에서 데이터를 조작/읽을 수 있습니다.

답변

2

내 대답은 : 가끔 있습니다. 아니요, 항상 새로운 연결을 열 필요는 없습니다. 한 연결에서 여러 트랜잭션을 사용할 수 있습니다. 이를 수행하는 간단한 방법은 db 변수를 해당 함수로 전달하는 것입니다. 그러나 indexedDB뿐만 아니라 javascript의 비동기성에 대해서도 알고 있어야합니다. 새로운 연결을 열어야 할 때가 있습니다. 예를 들어, 다른 이벤트의 트리거.

function domultiplethings() { 
    var db = ... 
    callfunction1(db); 
    callfunction2(db); 
} 

function callfunction1(db) { 
    if(!db) { 
    // open a new connection then call ourself 
    } else { 
    // active connection, do read/write stuff 
    } 
} 
+0

이 내가 무슨 생각의 종류 : 여러 트랜잭션을 수행하는 경우

그래서, 다음과 같은 많은 기능 무언가를 사용합니다. 하지만 당신 말이 맞아요, 자바 스크립트의 비동기 성질에 관한 문제에 봉착하고 있습니다. 괜찮습니다. 더 정확한 질문은 짐작할 수 있습니다. ** 여러 기능으로 여러 번 데이터베이스에 새로운 연결을 열어야한다는 것은 반드시 ** 나쁜 것입니까? – Garfonzo

+0

며칠 동안 연결을 열었습니다. 결코 문제가 없었습니다. 절대로 연결을 닫지 않고 버전 변경 이벤트를 수신합니다. 이 경우 반드시 닫아야합니다. –

+0

나는 지금까지 연결을 열 때마다 나쁜 습관 만 있지만 성능은 좋지 않다는 것을 발견했다. 나는 당신이 Joshua Bell의 Google 크롬 indexedDB 구현을 C/C++에서 볼 수 있음을 보았으며, 내가 기억하는 바로는 연결 풀링과 자동 연결 닫기가있다 (conn가 열리지 않을 때) 시간 초과 후. 간단히 말해서, "나쁘지 않은"것은별로 좋지 않습니다. – Josh

관련 문제