두 테이블을 사용하는 운동 추적 프로그램을 만들고 있는데, 하나는 여러 개의 동작을 포함 할 수있는 Workout_Container이고 다음은 실제 운동 (이름, 백분율 등). 각 테이블은 고유 한 키 필드 (_id)이지만 Movement_Container의 _id 필드는 관계형 데이터베이스이므로 Workout Container의 레코드 하나에 여러 항목이있을 수 있습니다. . 운동 테이블커서 어댑터의 여러 테이블 (또는 MergeAdapter
스키마는 다음과 같습니다
Main(_id INTEGER PRIMARY KEY AUTOINCREMENT, Workout_Date TEXT)
Workout_Container (_id INTEGER PRIMARY KEY AUTOINCREMENT, Date_ID INTEGER, AMRAP INTEGER, Rounds INTEGER, Finish_Time TEXT, Rounds_Finished INTEGER, IsWeight_Workout TEXT, Workout_Name TEXT, Comments TEXT).
Movement_Template (_id INTEGER PRIMARY KEY AUTOINCREMENT, Workout_Container_ID INTEGER, Sets INTEGER, Reps INTEGER, Movement TEXT, Time_of_Movement TEXT, Length INTEGER, Weight INTEGER, Percentage INTEGER, Comments TEXT).
홈페이지은 의 부모이고 운동 템플릿의 부모 인 Workout_Container입니다. 나는 첫 번째 (중복되는 것처럼 보이지만) 캘린더를 표시하는 데 다른 곳에서 사용되고 있으므로 마지막 두 테이블 만 신경 쓰고 주어진 날짜에 운동이 있는지 여부를 쿼리 할 때 더 작은 테이블을 원했습니다.
육안으로 볼 때 이것은 운동 선수 컨테이너가 그 아래에 나열된 운동의 부모가 될 것이므로 시각적으로 목록 어댑터와 유사하지만 계층 적 방식으로 보입니다. Workout Container는 Movements ....와 시각적으로 다르게 보일 것입니다. 이는 getView가 어떤 특정 .xml 형식을로드해야 하는지를 알아야 함을 의미합니다.
Workout Container (_id = 45)
===============
*Movement 1 (movement with Container_id = 45)*
*Movement 2 (movement with Container_id = 45)*
*Movement 3 (movement with Container_id = 45)*
Workout Container (_id = 46)
==============
*Movement 1 (movement with Container_id = 46)*
*Movement 2 (movement with Container_id = 46)*
각 행 자체 View
Adapter
의해 제시된 (CursorAdapter
또는 MergeAdapter
여부)이다. 사용자가 해당 행을 선택하여 편집하거나 삭제할 수 있습니다. 예, 행을 추가하는 기능이 있지만 아직 도착하지 않았습니다. 지금 당장은 두 테이블을 Cursor
쿼리로 병합하고 그날 Workout_Container의 모든 행과 Workout_Container에있는 JOIN을 통해 얻은 행에 해당하는 모든 행을 가져옵니다. 하지만이 두 테이블의 병합 및 단일 CursorAdapter
, 나 내가 Workout_Container .xml, 또는 Movement .xml 표시해야합니다 말할 수 없습니다. 이전 행에 대한 생각을 표시 할 때 나는 getView에 행을 표시하십시오. 위의 예제는 Workout Container _id = 45가 Cursor
에서 3 번 복제되고 Workout_Container _id = 46 정보가 Cursor
에서 2 번 반복 된 쿼리에서 5 행을 반환합니다.
내 질문은 이것입니다. 어떻게 표시합니까?
옵션 1 : 두 테이블을 하나의 커서보기로 병합해야합니까? 그렇다면 어떻게하면 Workout Container 정보가 여러 레코드에 대해 복제 될 수 있으며 어떤 행을 다시 볼 수 없기 때문에 새로운 Workout Container를 표시해야하는지 결정할 수 있습니다. ? CursorAdapter
은 각 행에 대해 고유 한 ID 번호가 필요하며 두 테이블의 각 _id가 독립적이기 때문에 가능하지 않습니다.
옵션 2 : 병합 어댑터를 사용하여 해당 날의 운동 컨테이너 한 행을 가져 와서 각 행을 자체 커서에 배치하십시오. 그런 다음 주어진 Workout Container _id에 해당하는 각 Movement의 단일 행을 가져 와서 자체 Cursor로 옮깁니다. MergeAdapter
에 각 커서를 자체로 입력하십시오 (CursorAdapter
). 나는 기본적으로 하나의 행을 가질 CursorAdapters
의 배열을 가질 것이다. 기본적으로 커서가 밟은 중첩 루프를 통과합니다. CursorAdapters
이 MergeAdapter
번으로 열릴 수 있으므로 큰 성과를 얻으시겠습니까?
옵션 3 : 각 테이블을 복제하는 클래스를 만들고 하나의 행을 클래스 배열에 부어 클래스 배열을 만들어 MergeAdapter
으로 보냅니다. CursorAdapter
가 이미 처리하는 더 많은 항목을 재정의해야하므로 가장 힘들 것 같습니다. 지금
, 나는 ... 유일한 작업이 숨겨져있는 조각에서 활동 작성시 모두 한 번에 AsyncTask
내에서 주어진 일에 대한 모든 pertinant Workout_Container의 행과 운동을 AsyncTask
항목된다 잡아와 다시 그것을 손 Activity
. 각 커서를 한 번에 하나씩 만들면서 행의 전체 커서를 가져 가서 통과시키는 것보다 어댑터에 대한 각 행을 손에서 꺼내야합니다 (AsyncTask
)?
내가 검색이 특정 상황에 도움이 아무것도 찾지 못했습니다 .... 내가이 이상 뇌와 쉽게 작업 할 것 같다 옵션 2 유일한 일을 건 드리는 봤는데으로이 모든 말이 바랍니다 .
데이터베이스 스키마 (두 테이블)를 게시 할 수 있습니까? – Luksprog
위의 원래 영역에 추가되었습니다. –