2012-11-24 8 views
5

का उपयोग कर एक स्क्लाइट डेटाबेस में पंक्तियां जोड़ना मैंने एक छोटा फोनगैप एप्लिकेशन बनाया है जो एक्सएमएल के माध्यम से अजाक्स कॉल से समाचार डेटा प्राप्त करता है। यह ठीक काम करता है, लेकिन मैं डेटा को ऑफ़लाइन पढ़ने की अनुमति देने के लिए डेटा को डेटाबेस तालिका में संग्रहीत करना चाहता हूं।लूप (फोनगैप)

तो जब अजाक्स कॉलबैक डेटा के माध्यम से लूप करता है, तो मैं इसके साथ एक वैश्विक समाचार वस्तु भरता हूं और फिर यह जांचने के लिए एक फ़ंक्शन को कॉल करता हूं कि डेटा पहले से ही डेटाबेस में संग्रहीत है या नहीं। यदि नहीं, तो इसे डेटाबेस समाचार तालिका में डाला जाना चाहिए।

समस्या

है कि सौदे में तालिका में खबर स्टोर करने के लिए है, ऐसा लगता है मेरी खबर वस्तु की तरह अब मौजूद नहीं है, क्योंकि मैं संदेश मिलता है:

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

तो मुझे लगता है कि सुनिश्चित कर सकते इस काम? यहाँ भाग के कोड जहां मैं समाचार का चयन करें और जाँच करना चाहते हैं अगर यह पहले से ही वहाँ है:

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

newsContainer डेटा के कुछ पंक्तियों से भर जाता है, मुझे लगता है कि जाँच की है। मैं बहुत खुश हूं अगर कोई मुझे समझने में मदद कर सकता है कि यह क्यों काम नहीं करता है।

अग्रिम धन्यवाद!

नमस्ते,

बर्न्ड

उत्तर

4

db.transaction अतुल्यकालिक है - समय से executeSql वास्तव में चलाता है, एन पहले से ही पाश के अंत तक वृद्धि की गई है।

प्रत्येक आइटम के लिए एक नया लेनदेन बनाने की बजाय, लेनदेन फ़ंक्शन के अंदर लूप को स्थानांतरित करने का प्रयास करें।

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