2013-11-25 3 views
1

http://docs.phonegap.com/en/3.1.0/cordova_storage_storage.md.html#SQLTransaction 목록 다음과 같은 자바 스크립트 코드 조각에서 폰갭 웹 SQL 데이터베이스 문서 :PhoneGap의 Web SQL 데이터베이스를 통해 SQL 문이 순차적으로 실행됩니까?

function populateDB(tx) { 
    tx.executeSql('DROP TABLE IF EXISTS DEMO'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)'); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")'); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")'); 
} 

내가 위의 코드 조각의 4 SQL 문을 순차적으로 실행됩니다 보장 있습니까 (즉, DROP TABLE 명령이 확실히 실행됩니다 첫 번째, 두 번째 등 CREATE TABLE 문 다음에)? 비동기식 PhoneGap Web SQL 데이터베이스 API의 특성에 대한 많은 게시물이 있지만 PhoneGap Web SQL 데이터베이스 API의 특성에 대한 게시물을 찾을 수 없습니다. 상상할 수 있듯이 DROP TABLE 문이 처음 실행을 끝내지 않은 경우 CREATE TABLE 문을 실행하는 것은 의미가 없습니다.

답변

0

예. if-else-then과 같은 몇 가지 조건부 브랜칭이 없다면 선은 순차적으로 실행됩니다.

상기 스 니펫의 경우 순차적으로 실행됩니다. 보장됨.

+0

이것을 확인하는 문서가 있습니까? – Mitch

+0

설명서가 없습니다. 그러나 제가 한 일은 항상 주문을 존중합니다. – Purus

0

불행히도, 보장 할 수 없습니다. Websql 스펙은 IndexedDB API가 수행하는 것과 달리 요청이 배치 순서에 따라 실행되어야한다고 말하지 않습니다. 하지만 대부분의 구현은 요청 순서를 존중하지만 거의하지 않습니다.

적절한 방법은 요청 성공 콜백을 듣고 순차 실행을 보장하기 위해 콜백에서 tx를 사용하는 것입니다.

+0

그래서 내가 만드는 첫 번째 테이블에 하나 이상의 인덱스가 필요한 경우 성공 콜백에서 인덱스를 만들어야합니까? 그리고 만약 내가 생성 할 5 개의 테이블을 가지고 있는데, 각각이 가장 최근에 생성 된 테이블에 대해 선언 된 외래 키를 가지고있다 (즉, 테이블 2는 테이블 1에 대한 외래 키를 가지고 있고, 테이블 3은 테이블 2에 대한 외래 키를 가지고있다). 나는 테이블 2의 성공 콜백에서 테이블 1, 테이블 3에 대한 success 콜백에서 테이블 2를 생성하는 것을 끝내는가? – Mitch

+0

나는 당신이 비 순응적인 문제에 직면하지 않을 것이라고 믿는다. 결코 들어 보거나 보지 못한다. – Purus

+0

여기에서 검색하십시오. 새로운 cordova에 이미 문제가 발생했습니다. –

0

동일한 문제가 있습니다. 나는 콜백 지옥을 피하기 쉽게하기위한 함수를 작성했다. 나는 거기에 아마 비슷한 것들이있을 것이라고 확신하지만 여기에 내 것이다. 나는 그것을 100,000 라인으로 테스트했지만 아무런 문제가 없었다.

function runSqlSeries(tx, sqls, parameterss, fnum, callback) { 
    if (typeof sqls === 'string') { 
     sqls = [sqls]; 
    } 
    var totalNumber = sqls.length; 
    var sqlIndex = fnum; 
    if (parameterss && sqls.length == 1 && parameterss.length > 1) { 
     //ie one sql statement run many times 
     totalNumber = parameterss.length; 
     sqlIndex = 0; 
    } 
    if (fnum >= totalNumber) { 
     callback(true, "success - ran " + fnum + " sql statements"); 
     return; 
    } 
    var successFn = function() { 
     astracore.runSqlSeries(tx, sqls, parameterss, fnum + 1, callback); 
    } 
    var errorFn = function(tx, error) { 
     callback(false, "Error running function " + fnum + " " + error.message); 
    } 
    var parameters = []; 
    if (parameterss) { 
     parameters = parameterss[fnum]; 
    } 

    tx.executeSql(sqls[sqlIndex], parameters, successFn, errorFn); 
};