0

저는 ListView를 작성 중이며 ListView의 각 항목에는 여러 가지 커서의 데이터가 있습니다. ListView의 각 항목에 대한 모든 데이터를 보유하는 객체가 있습니다. 이러한 개체의 ArrayList를 사용하여 ListView를 채 웁니다.커서가있는 CursorLoader가 루프 내에 있습니다.

지금 구현하고있는 방법에 따라 ContentProvider A의 모든 행에 커서를 가져옵니다.이 커서를 통해 루프를 반복하고 그 중 세 개를 ArrayList의 각 객체에 추가합니다. 이 루프를 반복 할 때마다 ContentProvider A의 필드를 기반으로 ContentProvider B의 필드를 가져 오는 새 커서가 만들어집니다.이 필드는 ContentProvider C의 다른 필드를 가져 오는 데 사용됩니다. 따라서 기본적으로 많은 커서가 만들어지고, 후속 커서의 쿼리는 이전 커서의 데이터에 종속됩니다.

내가 알기로 CursorLoaders 및 LoaderManager를 사용하여 별도의 스레드에서 커서를 생성하고 수명주기를 올바르게 관리하는 것이 이상적입니다. 이 접근법을 어떻게 번역 할 것인지, 또는 실제로 커서의 수를 최소화하는 더 나은 접근법이 있는지는 잘 모르겠습니다.

+1

'커서'는 데이터베이스 쿼리의 결과를 둘러싼 래퍼에 불과하므로 어쩌면 '중첩 된'커서에서 가져 오는 데이터가 포함 된 방식으로 후자를 최적화 할 가능성이 있습니다 ? –

+0

나는 너무 일반적으로 그것을 설명하려고 노력하고 있었고, 도취 당했다. 테이블은 실제로 ContentProviders입니다. 좀 더 구체적으로 내 질문을 수정하겠습니다. 미안합니다. –

답변

0

단순한 CursorLoader은이 경우 올바른 해결책이 아니라고 생각합니다.

  • 처음 Cursor에 대한 CursorLoader를 사용하고 ListAdapter의 getView() 메소드 내 -chaining CursorLoader를 사용 : 나는 당신이 두 가지 가능성이있을 수 있습니다 생각합니다. CursorLoader -chaining은 onLoadfinished() 메서드에서 initLoader()을 호출하는 것을 의미합니다.
  • AsyncTaskLoader을 사용하고 AsyncTask 내에서 필요한 개체 트리를 만듭니다.

목록의 길이가 길지 않다면 두 번째 해결책이 더 좋을 것 같습니다. 이것은 ContentProviders가 부족한 부분입니다. 기본적으로 n + 1 (귀하의 경우 n + 2) 시간에 하나의 조인만으로 충분해야합니다.

목록이 너무 길 경우 두 번째 방법을 사용할 수 없으면 사용자가 AsyncTask를 사용하는 데 너무 오래 걸릴 수 있습니다.

더 나은 해결책을 들어 보셨습니까?

+1

감사합니다! 질문이 제기 된 이래로 나는 여러 가지 구현을 시도해 왔으며 AsyncTask가 앞으로 나아갈 길 인 것처럼 보인다. 연쇄 제안을 주셔서 감사합니다. AsyncTask를 사용하면 어떤 방법이 더 효율적인지 쉽게 알 수 있습니다. 답변을 주셔서 다시 한번 감사 드리며 간결하지만 매우 유익합니다! –