2012-01-25 2 views
1

HTML5 웹 사이트에 대한 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

추가 된 웹-SQL 태그 -이 HTML5의 일부가되지 않습니다. – Nickolay

+0

동기 버전의 메소드가 스펙에 언급되어 있더라도 널리 지원되지 않는다는 것을 알고 있습니다. 나는 그것들을 직접 테스트했고, 예를 들어 Chrome v16.0.912.77은 동기 API (TypeError : "Object [object DOMWindow]에는 메소드 'openDatabaseSync'가 없음)를 지원하지 않습니다. 두 번째 질문에 대해서는 "executeSql"메서드가 생성 및 오류가 발생하지 않았습니까? 오류 콜백을 추가하고 오류가 발생했는지 확인하십시오. 또한 Chrome 개발자 도구의 리소스 탭에서 직접 실행하여 명령이 올바른지 확인할 수도 있습니다. –

+0

@Gabobcat openDatabaseSync는 Chrome에 존재하지만이를 사용하려면 WebWorkers를 사용해야합니다 ... 그렇습니다. 내 쿼리가 작동하는 것 같습니다. – Farid

답변

0

에서 stackoverflow에 대한 질문은 javascript로 "작동하지 않습니다"는 일반적으로 누락 된 괄호입니다 :) 그러나 귀하의 코드에서 하나를 찾지 못했습니다. 그게 내가 일을 단순화하고 기능을 multipurposing하지 않음으로써 시작할 것 실수가 아니라면 나는 어떤 경우

,[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 

이는 불을 지르고 또는 무엇 이건 당신의 코드를 디버깅 단순화하고 더 읽을 수 있습니다. 나중에 성능이 필요한 경우 기존 루프를 최적화로 재결합하여 사용할 수 있습니다 ... 조기 최적화는 대개 잘못된 아이디어입니다. 작동하는 명확한 코드를 작성하십시오. 최적화를해야한다고 생각하더라도 작동 시키십시오. 그리고 작동 후 최적화하십시오. (실제로 최적화가 필요하다는 것을 입증 한 후에 가능하면 좋습니다).

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

+0

그것은 실제로 preparedArray 질의를위한 인자를 전달하는 배열이다. 또한 내 코드의 문제는 asyncrhonous 문과 관련이 있습니다. execute 콜백은 비동기식이므로 searchByKeywords 메서드가 종료 될 때까지 books 배열이 비어 있습니다. – Farid