2009-11-25 4 views
1

SQL 구문 목록이 포함 된 JSON 파일에서 각 루프를 수행하고 한 번에 하나씩 전달하는 대신 Safari 클라이언트 측 저장소에서 데이터를 " BEGIN TRANSACTION "/"COMMIT TRANSACTION "을 호출하고이를 데이터베이스 시스템에 단일 호출로 전달합니까? 1000 개 이상의 문장을 반복하는 데 너무 많은 시간이 걸립니다.Safari에서 HTML5 저장소와 트랜잭션이 가능합니까?

현재 한 번에 하나의 트랜잭션을 반복 :

 
$j.getJSON("update1.json", 
    function(data){ 
    $j.each(data, function(i,item){ 
      testDB.transaction(
       function (transaction) { 
        transaction.executeSql(data[i], [], nullDataHandler, errorHandler); 
       } 
      ); 
    }); 
}); 

을 한 호출하는 방법을 알아 내려고 :

 
$j.getJSON("update1.json", 
    function(data){ 
      testDB.transaction(
       function (transaction) { 
        transaction.executeSql(data, [], nullDataHandler, errorHandler); 
       } 
      ); 
}); 

아무도 아직이 시도하고 성공을?

+0

여러분 모두에게 감사드립니다! – SKFox

답변

1

문서에서 찾을 수있는 모든 예제는 executeSql 명령 당 하나의 SQL 문만 표시하는 것으로 보입니다. 그래픽을 로딩하고 루프에서 SQL을 실행하는 "ajax 회 전자"를 보여줄 것을 제안합니다. 당신은 트랜잭션 내에서 모든 것을 유지할 수 있지만, 루프는 여전히있을 필요가있다 :

$j.getJSON("update1.json", 
    function(data){ 
     testDB.transaction(
      function (transaction) { 
       for(var i = 0; i < data.length; i++){ 
        transaction.executeSql(data[i], [], nullDataHandler, errorHandler); 
       } 
      } 
     ); 
    } 
); 

트랜잭션 내부의 루프를 이동 및 루프에서 좀 더 속도를 얻을 수 있도록해야 for i =를 사용하여. $.each은 1000 회 미만으로 좋으며, 그 후에는 for(var = i...이 더 빠를 것입니다.

참고 내 코드를 사용하여 SQL 문 중 하나에서 오류가 발생하면 전체 트랜잭션이 실패합니다. 이것이 의도가 아니라면 루프를 트랜잭션 외부에 두어야합니다.

+0

메모 수정하기. executeSql은 오류 콜백을 지원합니다. 예를 들어 errorHandler입니다. 이 핸들러가 true를 리턴하면 트랜잭션은 실패하고, false이면 트랜잭션이 계속됩니다 (또는 다른 f} 일 수 있습니다). – Michael

0

저는 HTML5 데이터베이스 저장소를 사용하지 않았습니다 (local/sessionStorage를 가지고 있습니다). 나는 하나의 커다란 문장을 실행할 수 있다고 가정합니다. data.join(separator here)을 사용하여 data 배열의 문자열 표현을 가져옵니다.

+0

답변 해 주셔서 감사합니다. ';'으로 구분할 때도 한 번에 하나 이상의 문장을 허용하지 않는 것 같습니다. – SKFox

+0

간단한 데이터베이스 조작을위한 작은 데이터베이스입니다. 본격적인 데이터베이스를 원하면 서버에 데이터를 보내십시오. 오프라인 작업을 원하면 단일 스레드 자바 스크립트 응용 프로그램에서 내장 데이터베이스가 정상적으로 작동합니다. –

0

예, webSQL을 사용하면 단일 트랜잭션 내에서 전체 명령문 그룹을 처리 할 수 ​​있습니다. 실제로 BEGIN 또는 COMMIT를 사용할 필요조차 없다. 동일한 트랜잭션에서 모든 executeSql 호출을 수행하는 한 자동으로 처리된다. 이 작업을 수행하는 동안 모든 진술이 트랜잭션 내에 포함됩니다.

이렇게하면 프로세스가 훨씬 빨라지고 명령문 중 하나에 오류가 있으면 전체 트랜잭션이 롤백됩니다.

관련 문제