2012-11-24 4 views
5

XML을 통해 Ajax 호출에서 뉴스 데이터를 가져 오는 작은 Phonegap 애플리케이션을 만들었습니다. 이 잘 작동하지만 데이터베이스 테이블에있는 데이터를 오프라인으로 읽을 수 있도록 데이터를 저장하고 싶습니다.루프를 사용하여 sqlite 데이터베이스에 행 추가 (Phonegap)

그래서 Ajax 콜백이 데이터를 순환 할 때 전역 뉴스 객체를 채운 다음 함수가 호출되어 데이터가 이미 데이터베이스에 저장되어 있는지 확인합니다. 그렇지 않은 경우 데이터베이스 뉴스 테이블에 삽입해야합니다.

Uncaught TypeError: Cannot read property 'title' of undefined in ...

그래서 어떻게 있는지 확인 할 수 있습니다

문제는 트랜잭션에서 테이블에 뉴스를 저장하는 것입니다, 내가 메시지를 얻을 수 있기 때문에 내 뉴스 개체가 더 이상 존재하지 않는 것 같다 이 일? 나는 뉴스를 선택하고 이미이 있는지 확인하려는 다음 부분의 코드는 다음 newsContainer 데이터의 몇 행으로 가득

// Check if a news from the internet already exists in the database; If not, insert it 
function checkNewsInDB(){ 
    db.transaction(function(tx){ 
     tx.executeSql("SELECT * FROM NEWS", [], checkSuccess, dbErrorCB); 
    }, dbErrorCB, dbSuccessCB); 
} 

// Result Callback from the News Check 
function checkSuccess(ctx, result){ 
    var len = result.rows.length; 
    var found = false; 
    for(var n = 0; n < newsContainer.length; n++){ 
     for(var r = 0; r < len; r++){ 
      if(result.rows.item(r).n_title == newsContainer[n].title 
       && result.rows.item(r).n_pubdate == newsContainer[n].pubdate){ 
       found = r; 
      } 
     } 
     if(found == false){ 
      db.transaction(function(tx){ 
       tx.executeSql("INSERT INTO NEWS (n_title, n_link, n_creator, n_pubdate, n_description) VALUES (?,?,?,?,?)", [newsContainer[n].title, newsContainer[n].link, newsContainer[n].creator, newsContainer[n].pubdate, newsContainer[n].description], insertSuccess, dbErrorCB); 
      }, dbErrorCB, dbSuccessCB); 
     } else { 
      found = false; 
     } 
    } 
} 

을, 나는 그것을 확인했다. 누군가가 왜 이것이 효과가 없는지 이해할 수 있으면 매우 행복 할 것입니다.

미리 감사드립니다.

인사말,

번드

답변

4

db.transaction가 비동기 - executeSql 실제로 실행, n은 이미 루프의 끝으로 증가 된 시간.

각 항목에 대해 새 트랜잭션을 만드는 대신 루프를 트랜잭션 함수 내에서 이동하십시오.

+0

예제 코드를 보내 주시겠습니까? 아직 이해할 수 없습니까? –

2

답변 해 주셔서 감사합니다. 다음은 동일한 문제가있는 모든 사람들에게 적용되는 코드입니다.

// Check if a news from the internet already exists in the database; If not, insert it 
function checkNewsInDB(){ 
    db.transaction(function(tx){ 
     tx.executeSql("SELECT * FROM NEWS", [], checkSuccess, dbErrorCB); 
    }, dbErrorCB, dbSuccessCB); 
} 

// Result Callback from the News Check 
function checkSuccess(ctx, result){ 
    var len = result.rows.length; 
    var found = false; 
    for(var n = 0; n < newsContainer.length; n++){ 
     for(var r = 0; r < len; r++){ 
      if(result.rows.item(r).n_title == newsContainer[n].title 
       && result.rows.item(r).n_pubdate == newsContainer[n].pubdate){ 
       found = r; 
      } 
     } 
     if(found == false){ 
      var title = newsContainer[n].title; 
      var link = newsContainer[n].link; 
      var creator = newsContainer[n].creator; 
      var pubdate = newsContainer[n].pubdate; 
      var description = newsContainer[n].description; 
      ctx.executeSql("INSERT INTO NEWS (n_title, n_link, n_creator, n_pubdate, n_description) VALUES (?,?,?,?,?)", 
         [title, link, creator, pubdate, description], insertSuccess, dbErrorCB); 
     } else { 
      found = false; 
     } 
    } 
} 
관련 문제