2013-11-25 24 views
1

http://docs.phonegap.com/en/3.1.0/cordova_storage_storage.md.html#SQLTransaction列出了下面的JavaScript代码片段的PhoneGap的Web SQL数据库文件:SQL语句是否通过PhoneGap的Web 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")'); 
} 

我保证,在上面的代码片段中的四个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

因此,如果我创建的第一个表需要一个或多个索引,那么我需要在成功回调中创建索引?如果我创建了五个表,每个表都有一个针对最近创建的表声明的外键(也就是说,表2具有针对表1的外键,表3具有针对表2的外键等),我最终在表1的成功回调中创建表2,在表2的成功回调中的表3中创建表2,等等? – Mitch

+0

我相信你不会面临任何乱序问题..从来没有听到或看到它。 – Purus

+0

只需在SO搜索。新科尔多瓦已经遇到问题报告 –

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); 
};