2012-12-27 35 views
0

我想使用JavaScript代碼訪問Sql Lite數據庫。 JavaScript代碼在html5中使用,必須在黑莓10平臺上部署。 我使用下面的代碼沒有成功:使用Javascript中的方法訪問

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
    <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> 
    <title>Prova</title> 
</head> 
<body> 
    <script type="text/javascript"> 
//Provenia SRL ITC - Paola Savioli 
//Questa funzione apre il database SQL Lite 
//Il parametro che va cambiato è il nome del database 
function ApriDatabase() { 
    try { 
     if (window.openDatabase) { 
      var shortName = 'Ristoranti.sqllite'; 
      var version = '1.0'; 
      var displayName = 'Ristoranti italia'; 
      var maxSize = 65536; // in bytes 
      db = openDatabase(shortName, version, displayName, maxSize); 
     } 
    } catch (e) { 
     alert('Apri Database' + e); 
    } 
} 
//Provenia SRL ITC - Paola Savioli 
// Questa funzione eseque una query su un database aperto con la funzione ApriDatabase 
function EseguiQuery($query, callback) { 
    try { 
     ApriDatabase(); 
     if (window.openDatabase) { 
      db.transaction(

      function (tx) { 
       tx.executeSql($query, [], function (tx, result) { 
        if (typeof (callback) == "function") { 
         callback(result); 
        } else { 
         if (callback != undefined) { 
          eval(callback + "(result)"); 
         } 
        } 
       }, function (tx, error) {}); 
      }); 
      return rslt; 
     } 
    } catch (e) { 
     alert('Esegui Query' + e); 
    } 
} 

function VisualizzaComuni() { 
    try { 
     var schemanode = document.GetElementById('RCOMUNI'); 
     schemanode.innerHTML = ""; 
     var result = EseguiQuery('SELECT * FROM COMUNE'); 
     for (var i = 0; i < result.rows.lenght; ++i) { 
      var row = result.row.item(i); 
      var notediv = document.createElement('div'); 
      notediv.innerHTML = 'Codice Provincia:' + row['PROVINCIA'] + 'Nome:' + row['NAME']; 
      schemanode.appendchild(notediv); 
     } 
    } catch (e) { 
     alert('Visualizza Comuni' + e); 
    } 
} 
</script> 
    <input type="button" name='select' onClick="VisualizzaComuni()" 
     value='Visualizza Comuni'> 
    <div id="RCOMUNI"></div> 
</body> 
</html> 

能anyoune幫助我嗎? Simone

+3

我對黑莓手機並不瞭解,但在大多數平臺上,不可能有使用Javascript與本地數據庫進行交互的HTML網站(除非它們公開可以使用XmlHttpRequest訪問的Web服務)。 – Philipp

+0

@Philipp - HTML5在瀏覽器中包含了幾個不同的數據庫層,包括Blackberry 10支持的['localStorage'](https://developer.blackberry.com/html5/api/localStorage.html)。不知道這個或其他格式之一是否是SQLite。 –

+0

這裏是另一個由Blackberry 10支持的數據庫:https://developer.blackberry.com/html5/apis/database.html我只是看看API,看看提供了什麼。 **編輯**:其實,這似乎是什麼試圖在問題代碼。 –

回答

1

您可以考慮使用WebSQL API,根據http://caniuse.com/#feat=sql-storage在BlackBerry 7和10上支持。

請注意,API將永遠不會成爲官方標準,並且其開發已停止。但是如果你只是想瞄準黑莓手機,這可能是一個有效的選擇。

1

有幾個問題,你的代碼已經發布,包括.lenght而不是.length和使用try catch塊時,有內置的成功和錯誤處理程序的參考。所以我做了一個演示。

首先,它似乎沒有區別,但這是HTML5對不對?相反的HTML 4.01 Transitional的doctype,使用HTML5文檔類型:

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
<title>demo by userdude</title> 
... 

接下來,我修改了標記爲示範的目的。在這種情況下,我們有:

<body> 
<input type="button" id="run" value='Run Query'> 
<div id="query"></div> 
<table id="table" border="1" cellspacing="1" cellpadding="5"></table> 
</body> 
</html> 

head元素,我使用事件偵聽器等待DOM加載。請記住,我沒有Blackberry來測試此功能,並且使用Blackberry或其他設備,您應該使用deviceready而不是load。我認爲。我還附加了使用.addEventListener運行查詢的button的事件處理程序,但請注意我在裝載處理程序內執行了該操作。您必須等待才能訪問DOM。

此外,IE支持attachEvent而不是addEventListener。我想黑莓支持後者,但我不確定。

window.addEventListener('load', function load(){ 
    var run = document.getElementById('run'), 
     data = document.getElementById('table'), 
     qtext = document.getElementById('query'), 
     dropped = false, 
     created = false, 
     cities = ['Houston', 'Dallas', 'Paris', 'New York', 'Buenos Aires', 'London'], 
     shortName = 'Cities', 
     version = '1.0', 
     displayName = 'Cities Demo', 
     maxSize = 5 * 1024 * 1024, 
     db = false, 
     queries = []; 

    run.addEventListener('click', query); 

這建立了我的數據庫,包括運行初始調用populate(),所以我們有一些數據使用。

open(); 

這是我添加到運行按鈕的功能。

function query() { 
     transact('SELECT * FROM Cities', view); 
    } 

這只是爲了將數據添加到數據庫。請參閱上面的cities變量。

function populate(tx) { 
     var city, 
      i = 0; 

我阻止此從運行一旦我清空cities陣列條目的至INSERTdroppedcreatedDROPCREATE交易執行相同的操作。

特價請注意我是怎麼做到的;請參閱transact('...', populate)?在這種情況下,我使用populate來回送,直到完成添加所有cities條目。這是異步的,因此必須設置回調才能在必要時等待以前的查詢運行。在這種情況下,我最終可能會在添加我的行後刪除表。所以我必須等待,然後循環通過cities列表。

 if (cities) { 
      if (!dropped) { 
       dropped = true; 
       transact('DROP TABLE IF EXISTS Cities', populate); 

       return; 
      } 

      if (!created) { 
       created = true; 
       transact('CREATE TABLE IF NOT EXISTS Cities (id unique, City)', populate); 

       return; 

      } 

我並不需要循環回populate這裏,因爲我只需要INSERT,繼續前進。

  while (city = cities.pop()) { 
       transact('INSERT INTO Cities (id, City) VALUES (' + i++ + ', "' + city + '")'); 
      } 

      cities = false; 
     } 
    } 

所有這個函數的作用是給無論是打開或新的參考數據庫,或return false。這使transact()的執行短路。

function open() { 
     if (!db && window.openDatabase) { 
      db = window.openDatabase(shortName, version, displayName, maxSize); 
     } 

     if (cities) { 
      db.transaction(populate); 
     } 

     return db; 
    } 

這是劇本的肉。我將它稱爲query(),並且callback在這種情況下是view,它指向貫穿結果集並在該集合中創建table的函數。

function transact(query, callback) { 
     var cb = callback, 
      qel = document.createElement('p'), 
      qid = queries.length; 

     if (!open()) { 
      console.log('HTML5 Database not supported.'); 

      return false; 
     } 

     db.transaction(transact_cb); 

     qel.innerHTML = query + ' Query Result: <span id="q' + qid + '">Pending...</span>'; 

     qtext.appendChild(qel); 

     queries[qid] = query; 

請注意最後兩個參數transact_success, transact_error。這就是你如何處理這些異步調用。

 function transact_cb(tx) { 
      tx.executeSql(query, [], transact_success, transact_error); 
     } 

不太確定爲什麼在那裏有一個eval ......?

 function transact_success(tx, result) { 
      var rtext = document.getElementById('q' + qid); 

      rtext.className = 'success'; 
      rtext.innerHTML = 'Success.'; 

      if (typeof cb == "function") { 
       cb(result); 
      } else if (cb != undefined) { 
       eval(cb + "(result)"); 
      } 
     } 

注意console.log(error);

 function transact_error(tx, error) { 
      var rtext = document.getElementById('q' + qid); 

      rtext.className = 'error'; 
      rtext.innerHTML = 'Error logged to console.'; 

      console.log(error); 
     } 
    } 

而這個函數創建table結果集視圖。您可能會注意到我循環遍歷每一行,分別爲

function view(result) { 
     var thead = '<thead><tr>', 
      tbody = '<tbody>', 
      row, 
      col; 

     for (var i = 0, rows = result.rows.length; i < rows; ++i) { 
      row = result.rows.item(i); 

      tbody += '<tr>'; 

      for (col in row) { 
       if (i === 0) { 
        thead += "<th>" + col + "</th>"; 
       } 

       tbody += '<td>' + row[col] + '</td>'; 
      } 

      tbody += '</tr>'; 
     } 

     thead += '</tr></thead>'; 
     tbody += '</tbody>'; 

     data.innerHTML = thead + tbody; 
    } 

}); 

您可以點擊這裏下載HTML文件下載文件並在本地運行(由於安全錯誤,它不會跑的jsfiddle):

http://pastebin.com/FcSiu6ZZ

所以你走。希望這將有助於更容易理解。如果您有任何問題,請告訴我。

相關問題