2017-01-03 48 views
0

我正在努力與Phonegap/Cordova的錯誤。我建立和連接設備中測試我的應用程序,這是我得到的錯誤:使用webSQL(SQLite)phonegap代碼有問題的承諾

INVALID_STATE_ERR:DOM異常11

無我發現作品的解決方案。他們中的大多數都旨在使用ajax,而這裏並不是這種情況。我發現了另一個關於phonegap的問題,他們說這可能是因爲該設備還沒有準備好,但我已經檢查過我的設備。

這是在錯誤被拋出(我使用的是無極填充工具BTW,因爲它不是在科爾多瓦支持到目前爲止)的代碼:我懷疑它可能有一些做

/** 
* Clients insertion 
* @param tx 
* @param clientes 
* @return {Promise} 
*/ 
clientes = function(clientes) { 

    return new Promise(function(resolve, reject) { 
     var clientesCount = clientes.length; 

     if (clientesCont === 0){ 
      resolve(); 
     } 
     else { 
      APP.db.transaction(function(tx) { 
       $.each(clientes, function(i, cliente) { 

        var idclienteLocal; 

        // Current client 
        tx.executeSql("INSERT OR REPLACE INTO clientes (id, name, ...) " + 
         "VALUES " + 
         "(?,?,...)", 
         [cliente.id, cliente.name], 
         function(tx, res) { 

          clientesCount--; 

          idclienteLocal = res.insertId; 

          // Clien phones 
          telefonosCliente(tx, cliente, idclienteLocal).then(function() { 
           // Client credits 
           creditosCliente(tx, cliente, idclienteLocal).then(function() { 
            if (clientesCount === 0) { 
             resolve(); 
            } 
           }).catch(function(error) { 
            reject('Error créditos cliente ' + cliente.empresa + ': ' + error); 
           }); 
          }).catch(function(error) { 
           reject('Error teléfonos cliente ' + cliente.empresa + ': ' + error); 
          }); 

         }, function(tx, error) { 
          reject(error.message); 
         }); 

       }); 
      }); 
     } 
    }); 
} 

循環(我爲此使用jQuery),所以我嘗試使用遞歸函數對前一個迭代進行排序,但它甚至不能在瀏覽器中工作(第一個處理器中的PromiseClient ()調用,在clientes()內不會解決)。這裏是修改後的代碼:

/** 
* Recursive function to process each client one after the other 
* @param tx 
* @param clientes 
* @param cliente 
* @return {Promise} 
*/ 
procesarCliente = function(tx, clientes, cliente) { 
    return new Promise(function(resolve, reject) { 
     // Current client 
     tx.executeSql("INSERT OR REPLACE INTO clientes (id, name, ...) " + 
      "VALUES " + 
      "(?,?,...)", 
      [cliente.id, cliente.name,...], 
      function(tx, res) { 
       var idclienteLocal = res.insertId; 

       // Client phones 
       telefonosCliente(tx, cliente, idclienteLocal).then(function() { 
        // Client credits 
        creditosCliente(tx, cliente, idclienteLocal).then(function() {       
         if (clientes.length === 0) { 
          resolve(); 
         } 
         else { 
          procesarCliente(tx, clientes, clientes.shift()); 
         } 
        }).catch(function(error) { 
         reject('Error créditos cliente ' + cliente.empresa + ': ' + error); 
        }); 
       }).catch(function(error) { 
        reject('Error teléfonos cliente ' + cliente.empresa + ': ' + error); 
       }); 

      }, function(tx, error) { 
       reject(error.message); 
      }); 
    }); 
}, 
/** 
* Clients insertion 
* @param tx 
* @param clientes 
* @return {Promise} 
*/ 
clientes = function(clientes) { 

    return new Promise(function(resolve, reject) { 
     var cliente, 
      clientesCont = clientes.length; 

     if (clientesCont === 0){ 
      resolve(); 
     } 
     else { 
      APP.db.transaction(function(tx) { 
       cliente = clientes.shift(); 
       procesarCliente(tx, clientes, cliente).then(function() { 
        resolve(); 
       }).catch(function(error) { 
        reject(error); 
       }); 
      }); 
     } 
    }); 
} 

有關修復第二種方法的任何幫助,最重要的是如何讓它在phonegap中工作?

編輯

我添加了一個驗證碼檢查每個本地數據庫中的表,而且奇怪的是,它apparenntly只創建兩個表名爲「不確定」和「項目」(我不」即使使用這樣的表格)。

的驗證碼在這裏:

if (APP.DEBUG) { // this is true 
     // Verify inserted data when triggered event 'app.load.all' just after the very last item in the DB has been inserted 
     $wrapper.on('app.load.all', function() { 
      APP.db.transaction(function(tx) { 
       console.log('Verifying DB'); 
       tx.executeSql("SELECT name FROM sqlite_master WHERE type='table'", [], 
        function(tx, res) { 
         if (res.rows.length) { 
          $.each(res.rows, function(i, tabla) { 
           if (tabla.name !== '__WebKitDatabaseInfoTable__') { 
            console.log('Verifying table ' + tabla.name); 
            tx.executeSql("SELECT * FROM " + tabla.name, [], 
             function(tx, res) { 
              console.log("Table " + tabla.name + " has " + res.rows.length + " records"); 

             }, 
             function(tx, error) { 
              console.log('Error verifying table ' + tabla.name + ':' + error.message); 
             }); 
           } 
          }); 
         } 
        }, function(tx, error) { 
         console.log('Error verifying DB tables: ' + error.message); 
        }); 
      }); 
     }); 
    } 

這導致在這些線路的 「Web控制檯」 過濾:

I/Web Console(14391): Verifying DB:1085 
I/Web Console(14391): Verifying table undefined:1091 
I/Web Console(14391): Verifying table item:1091 
I/Web Console(14391): Error Verifying table undefined:no such table: undefined:1100 
I/Web Console(14391): Error Verifying table item:no such table: item:1100 

這是完全陌生的,我

回答

0

我終於發現了問題:

我可以在瀏覽器中像一個數組一樣處理一個SQLResult對象,但是這個a在phonegap內部不起作用(可能是因爲Android WebView瀏覽器)。因此,實際上沒有插入任何記錄。

我不得不擺脫了jQuery循環(他們沒有得到在PhoneGap的應用程序的每個項目),並使用一個for循環來代替,並最終使用的SQLResult的項目()方法對象:

BAD:

$.each(res.rows, function(i, item) { 
    //... 
} 

GOOD:

var item; 
for (var i = 0; i < res.rows.length; i++) { 
    item = res.rows.item(i); 
}