2012-01-25 81 views
1

我有幾個關於Sqlite實現HTML5網站的問題。HTML5 SQLite Db問題

首先,我試圖使用同步數據庫調用openDatabaseSync方法,但它似乎並沒有工作......有人使用它,可以幫助我嗎?

此外,我掙扎了一下,試圖通過我的數據庫查詢處理結果返回。我想我的函數返回書的數組,像這樣:

function searchByKeywordId(kw_id, element) { 
    cleanSearch(); 
    element.innerHTML = "No result..."; 
    var books = new Array(); 

    db.transaction(function (tx) { 
     tx.executeSql("SELECT b.BK_TITLE,b.BK_URL, b.BK_THUMBNAIL_URL FROM KEYWORDS k INNER JOIN CATALOG_ITEMS c on k.KW_ID = c.KW_ID INNER JOIN BOOKS b on c.BK_ID = b.BK_ID WHERE k.KW_ID = ? GROUP BY b.BK_TITLE,b.BK_URL",[kw_id], function (tx, results) { 
      if (results.rows.length > 0) { 
       var html = ""; 
       for (var i = 0; i < results.rows.length; i++) { 
        var bookId = results.rows.item(i).BK_ID; 
        var bookUrl = results.rows.item(i).BK_URL; 
        var bookTitle = results.rows.item(i).BK_TITLE; 
        var bookThumbnailUrl = results.rows.item(i).BK_THUMBNAIL_URL; 
        var book = new Book(bookId,bookTitle,bookUrl,bookThumbnailUrl); 
        books.push(book); 

        /*html += "<div class='x_container' id='calibre:book:" + bookId + "'>"; 
        html += "<div class='cover'>"; 
        html += "</div></div>";*/ 
        html += "<a href='" + bookUrl + "' title=\"" + bookTitle + "\" target='_new'><img src='" + bookThumbnailUrl + "'></a> &nbsp;"; 
        } 
       //html += "</div>"; 
       element.innerHTML = html; 
      } 
     }); 
    }); 

    return books; } 

明顯,加上回調方法內的書籍不工作...你看到一個方法,我可以做到這一點?所以,我不會寫在我的數據庫方法的文件...

謝謝!

+0

添加了Web-SQL標籤 - 請注意,這不是HTML5的一部分。 – Nickolay

+0

據我所知,同步版本的方法並未得到廣泛支持,即使它們在規範中提到過。我自己測試了它們,例如Chrome v16.0.912.77不支持同步API(TypeError:「Object [object DOMWindow] has no method'openDatabaseSync'」)。關於你的第二個問題,你確定「executeSql」方法沒有生成和錯誤嗎?將錯誤回調添加到它並查看是否引發錯誤。另外,您可以直接在Chrome中的「開發人員工具」的「資源」選項卡中執行,以確保您的命令是正確的。 –

+0

@Gabobcat openDatabaseSync確實存在於Chrome中,但爲了使用它,您必須使用WebWorkers ...並且是的,我確定我的查詢能夠正常工作 – Farid

回答

0

在stackoverflow與JavaScript的問題和「不工作」在它通常是一個失蹤paren :)但是我沒有找到你的代碼。我看到周圍

,[kw_id], << did we really mean an array here, or are we de-referencing something... 

一些形跡可疑的語法在任何情況下,如果這不是一個錯誤,我會通過簡化的東西,而不是你的multipurposing功能啓動。

function searchByKeywordId(kw_id, element) { 
    cleanSearch(); 
    var books = new Array(); 

    db.transaction(function (tx) { 
     tx.executeSql("SELECT b.BK_TITLE,b.BK_URL, b.BK_THUMBNAIL_URL FROM KEYWORDS k INNER JOIN CATALOG_ITEMS c on k.KW_ID = c.KW_ID INNER JOIN BOOKS b on c.BK_ID = b.BK_ID WHERE k.KW_ID = ? GROUP BY b.BK_TITLE,b.BK_URL",[kw_id], function (tx, results) { 
      if (results.rows.length > 0) { 
       var html = ""; 
       for (var i = 0; i < results.rows.length; i++) { 
        var bookId = results.rows.item(i).BK_ID; 
        var bookUrl = results.rows.item(i).BK_URL; 
        var bookTitle = results.rows.item(i).BK_TITLE; 
        var bookThumbnailUrl = results.rows.item(i).BK_THUMBNAIL_URL; 
        var book = new Book(bookId,bookTitle,bookUrl,bookThumbnailUrl); 
        books.push(book); 

       } // end for loop 
      } // end if block 
     } // end execute callback 
     ); // end executeSql call 
    } // end transaction function argument 
    ); // end db.transaction call 

    return books; 
} 

然後的地方,你調用此函數做這樣的事情:

var html=""; 

for (i=0; i<books.length; i++) { 
    html += "<a href='" + books[i].url + "' title=\"" + books[i].title + "\" target='_new'><img src='" + books[i].thumbnailUrl + "'></a> &nbsp;";          
} 
if (html == "") { 
    html = "No result..."; 
} 
element.innerHTML = html; // consider using jQuery here for browser compatability reasons 

這將簡化在Firebug或任何調試代碼,並更具可讀性。後來如果你需要性能,你可以嘗試重新組合和使用現有的循環作爲優化...不成熟的優化通常是一個壞主意。寫清楚的代碼,工作。即使你知道你應該優化它,讓它工作,然後優化它(最好是在你證明你確實需要優化它之後)。

http://www.flounder.com/optimization.htm

+0

感謝您的意見。它確實是一個數組,爲prepareStatement查詢傳遞參數。此外,在我的代碼中的問題,你也是關於異步聲明:執行回調是異步的,所以到searchByKeywords方法結束時,books數組是空的...... – Farid