2012-11-13 5 views
0

각 항목에 추가 쿼리가 필요한 Phonegap (Cordova) 앱에 항목 목록을 표시하려고합니다.두 번째 쿼리가 첫 번째 쿼리에 의존하는 두 개의 쿼리

간단히하기 위해 예제로 설명하겠습니다. student에 (many-to-many)을 많이 가질 수있는 coursecourse을 가질 수 있으며 학생이 어떤 코스에 등록했는지 보여주는 목록을 표시하려고합니다.

  • Student1 :이처럼 course1, course3 물론 5
  • Student3 : course1,
  • Student2 course2 course2
  • ...

첫째, 나는에 질의를 필요로 모든 학생을 반복 한 다음 각 학생에 대해 DB에 쿼리하여 어떤 과목을 등록했는지 알아야합니다.

db.transaction(function(tx) { 
    tx.executeSql('SELECT `student`.`id`, `student`.`name` ' + 
      'FROM `student`', 
      [], 
      function(tx, resultSet) { 
       for(var i = 0; i < resultSet.rows.length; i++) { 
        tx.executeSql('SELECT `course`.`name` ' + 
          'FROM `student_has_course` ' + 
          'INNER JOIN `student` ON `student_has_course`.`student_id` = `student`.`id` ' + 
          'INNER JOIN `course` ON `student_has_course`.`course_id` = `course`.`id` ' + 
          'WHERE `student`.`id` = ?' 
          [resultSet.rows.item(i).id], 
          function(tx2, resultSet2) { 
           // TODO 
          }); 
       } 
      }); 
}, function(err) { 
    showError('Error getting students from the DB (' + err.message + ')'); 
}, function() { 
    alert('success!'); 
}); 

이제 문제는 두 번째 콜백 함수 ("TODO"가있는 위치)에서 이전 쿼리의 데이터에 대한 참조가 없다는 것입니다. 예를 들어, alert(i)을 시도하면 76으로 알려주며 이는 resultSet.rows.length과 같습니다. 이는 두 콜백 함수가 모두 비동기 적이기 때문에 분명합니다. 위에 표시된 것처럼이 문제를 극복하고 목록을 인쇄하려면 어떻게해야합니까?

도움을 주시면 감사하겠습니다.

답변

2

당신은 같은 콜백 함수 자체에 속성을 부착하여이 문제를 해결 할 수 있어야한다은 다음과 같습니다

cb = function cbfunc() { 
    doStuffWith(cbfunc.data) 
} 
cb.data = ... // whatever 
tx.executeSQL(..., cb) 

을 아직도 내가 하나와 예상되는 결과를 생산하여 두 번째 콜백을 피할 수 있다면 나는 두 번 생각 질문. 이 경우 :

select student.id, student.name, course.name from student 
    inner join student_has_course on student.id = student_has_course.student_id 
    inner join course on student_has_course.course_id = course.id 
     order by student.id; 

루프에서

는 원하는 출력 형식으로 얻기 위해, 줄 바꿈 및 새로운 학생의 이름을 인쇄 할 때 알 수있는 이전 반복의 하나와 student.id을 비교합니다.

+0

고맙습니다. @jop. 이것은 단지 해결 방법이지만, 어떤 상황에서도 작동 할 수있는 일반적인 솔루션을 찾고 있습니다. – satoshi

+0

. 이 예제에서는 하나의 SQL이 여전히 더 좋아 보이는 경우에도 더 일반적인 솔루션을 제공하기 위해이 스크립트를 편집했습니다. – jop

+0

감사합니다. 그 해결책이 작동했습니다 :) – satoshi

관련 문제