2012-01-25 18 views
1

HTML5 WebサイトのSqlite実装に関するいくつかの質問があります。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: "オブジェクト[オブジェクトDOMWindow]にはメソッド 'openDatabaseSync'がありません)。あなたの2番目の質問については、 "executeSql"メソッドが生成されていないとエラーが発生していませんか?エラーコールバックを追加して、エラーがスローされたかどうかを確認します。また、Chromeの開発者ツールの[リソース]タブで直接コマンドを実行して、コマンドが正しいことを確認することもできます。 –

+0

@Gabobcat openDatabaseSyncはChromeには存在しますが、使用するにはWebWorkersを使用する必要があります...はい、私のクエリは正常に動作していると確信しています – Farid

答えて

0

私はあなたのコードで1つを見つけることができませんでした。それは、私は物事を単純化し、あなたの関数をmultipurposingないことから始めるでしょう間違いはない場合、私はどのような場合には

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

周りにいくつかの不審な探して構文を参照してください。

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のか、何で自分のコードをデバッグ簡素化し、より読みやすくなります。

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

は、その後どこかにあなたがこの関数を呼び出したことを、このような何かを行います。後でパフォーマンスが必要な場合は、既存のループを再結合して最適化として使用することができます...早すぎる最適化は、通常、悪い考えです。動作する明確なコードを書く。あなたがそれを最適化すべきであると分かっていても、それを働かせてからそれを最適化してください(できれば、それを実際に最適化する必要があることを実証した後であることが望ましいです)。

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

+0

それは実際に配列であり、preparedStatementクエリの引数を渡します。また、私のコードの問題は、asyncrhonousステートメントについてです:executeコールバックは非同期なので、searchByKeywordsメソッドが終了するまでに、books配列は空です... – Farid