1

HTML5 Web サイトの Sqlite 実装に関していくつか質問があります。

まず、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; }

明らかに、コールバック メソッド内に本を追加しても機能しません...それを達成する方法がわかりましたか? データベースメソッドからドキュメントに書き込む必要がないように...

ありがとう !

4

1 に答える 1

0

スタックオーバーフローでは、javascript と「動作しない」という質問は、通常、括弧がありません:)しかし、あなたのコードには見つかりませんでした。疑わしい構文がいくつかあります

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

いずれにせよ、それが間違いでなければ、機能を多目的化するのではなく、単純化することから始めます。

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

于 2012-02-04T05:21:25.417 に答える