1

두 테이블을 사용하는 운동 추적 프로그램을 만들고 있는데, 하나는 여러 개의 동작을 포함 할 수있는 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)* 

각 행 자체 ViewAdapter 의해 제시된 (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의 배열을 가질 것이다. 기본적으로 커서가 밟은 중첩 루프를 통과합니다. CursorAdaptersMergeAdapter 번으로 열릴 수 있으므로 큰 성과를 얻으시겠습니까?

옵션 3 : 각 테이블을 복제하는 클래스를 만들고 하나의 행을 클래스 배열에 부어 클래스 배열을 만들어 MergeAdapter으로 보냅니다. CursorAdapter가 이미 처리하는 더 많은 항목을 재정의해야하므로 가장 힘들 것 같습니다. 지금

, 나는 ... 유일한 작업이 숨겨져있는 조각에서 활동 작성시 모두 한 번에 AsyncTask 내에서 주어진 일에 대한 모든 pertinant Workout_Container의 행과 운동을 AsyncTask 항목된다 잡아와 다시 그것을 손 Activity. 각 커서를 한 번에 하나씩 만들면서 행의 전체 커서를 가져 가서 통과시키는 것보다 어댑터에 대한 각 행을 손에서 꺼내야합니다 (AsyncTask)?

내가 검색이 특정 상황에 도움이 아무것도 찾지 못했습니다 .... 내가이 이상 뇌와 쉽게 작업 할 것 같다 옵션 2 유일한 일을 건 드리는 봤는데으로이 모든 말이 바랍니다 .

+0

데이터베이스 스키마 (두 테이블)를 게시 할 수 있습니까? – Luksprog

+0

위의 원래 영역에 추가되었습니다. –

답변

2

가 어떻게이 표시 가겠어요

?

옵션 # 2, # 3 또는 # 4를 사용합니다.

옵션 # 4 : 특정 운동에 대한 움직임을 표시할지 여부를 사용자가 확장하고 축소 할 수있는 기능이 추가되어 정확히 UI가있는 것처럼 보이는 ExpandableListView을 사용하십시오.

MergeAdapter에서 여러 개의 CursorAdapter를 열어서 성능이 크게 향상 될 수 있습니까? 디스플레이 관점에서

하지 않습니다. N + 1 개의 쿼리를 수행하는 것처럼 데이터를로드하는 데 약간의 비용이 듭니다. 하나는 워크 아웃이고 다른 하나는 워크 아웃에 대한 것입니다.

당신은 getCount(), moveToPosition() 재정의하는 CursorWindowAdapter을 만들어이에 따라 개선 할 수있는, 그리고 아마도 다른 것들 그것이 Cursor의 하위 집합을 "적용"하도록 (행의 위치와 #을 시작합니다). 그런 다음 두 개의 쿼리 만 필요합니다. 하나는 운동을위한 것이고 다른 하나는 모든 움직임을위한 것이고, 다른 하나는 운동에 의해 순서가 정해진 것입니다. 그런 다음 각 운동의 움직임 집합에 대해 Cursor 운동을 스캔하여 CursorWindowAdapter 인스턴스를 만듭니다. 신뢰할 수있는 CursorWindowAdapter을 만드는 것이 얼마나 쉽고 어렵습니까? 또한 데이터 세트가 작 으면 데이터가 없어도 벗어날 수 있습니다.

CursorAdapter가 이미 처리하는 많은 항목을 재정의해야하므로 가장 어려워 보입니다.

더 큰 질문은 : 당신은이 데이터와 함께 할 이 목록에 그것을 보여주는 이상 무엇을하려고합니까? 의도 된 용도가 Cursor 항목보다 POJO에 적용되는 것이 더 합리적이라면 데이터 세트를 적절한 POJO 트리로 변환하는 것이 좋습니다. display-the-list 문제를 별도로 생각하지 마십시오.

AsyncTask는 행의 전체 커서를 가져 가서 통과하는 대신 한 번에 하나씩 각보기를 만드는대로 각 행을 어댑터에 전달해야합니까?

그것은 주위 MergeAdapter 시나리오에 대한 다른 방법이 될 것입니다 : 당신이 다음 onPostExecute()MergeAdapter를 구축, 모든 쿼리가 완료 때까지 기다려야 할 것입니다. MergeAdapter의 큰 한계는 AdapterView에 첨부하면 더 많은 어댑터 /보기를 추가 할 수 없다는 것입니다.

+0

나는이 활동 내에서 주어진 운동이나 컨테이너 (그리고 그것에 포함 된 모든 움직임)를 추가, 편집 또는 삭제할 수있는 활동이 될 것입니다. 'MergeAdapter'한계를 벗어나려면 새로운 어댑터 세트 (예 : Movement/Container 삭제 사용자)를 사용하여 필요한 SQL을 실행하고 다시 쿼리하고 어댑터를 다시 연결하여 활동에서 분리/다시 부착하는 방법이 있습니까 (POJO 또는 커서 여부)? 내가 할 수있는 다른 방법은 POJO를 DB 스키마를 기반으로 만들고 'AsyncTask'내에 채우고 .xml 인플레이션을위한 활동으로 넘겨 준다. –

+0

'확장형 목록보기'에 대한 교육 자료에서 오늘 밤 귀하의 사례를 살펴 보겠습니다. JSON이 포함되어 있지만 다른 항목에도 적용 할 수 있습니다. –

+0

"활동에서 분리/재 첨부하는 방법이 있습니다."- 새로운 MergeAdapter를 생성하고 이것을 사용하여 ListView에서 사용하는 기존 어댑터를 대체 할 수 있습니다. – CommonsWare

관련 문제