2011-09-28 16 views
12

Moja aplikacja używa CursorLoader do ładowania danych z głównej tabeli. Dane będą wyświetlane w ListView przy pomocy CursorAdapter. Widok wyświetlany w ListView wymaga również danych z tabeli podrzędnej. Związek tabel jest jeden do wielu.Jak pobrać dane z tabeli podrzędnej za pomocą narzędzia CursorLoader, które ładuje dane z głównej tabeli?

  • Jeśli łączę oba stoły podczas kwerendy, połączone rekordy będzie tyle, ile rekordów podrzędnych, a więc w ListView, wyświetli wielokrotności rzecz dla jednego rekordu w tabeli głównej.

  • Jeśli nie dołączę do tabeli, nie jestem pewien, jaki jest najlepszy sposób na odzyskanie rekordów potomnych po tym, jak CursorLoader dostarczył dane za pośrednictwem kursora. Czy ktoś może mi pomóc?

+0

Czy znalazłeś odpowiedź na to pytanie? Szukam czegoś podobnego. Ja też chcę mieć 2 stoły z relacją Jeden do wielu; i szukam efektywnego sposobu ładowania danych za pomocą 'Loader's. – curioustechizen

Odpowiedz

0

Powinieneś wypróbować opcję łączenia i ustawić kolejność sortowania dla zapytania, aby upewnić się, że wyniki są sortowane według wyników w głównej tabeli.

Następnie można użyć elementu ExpandableListView, aby pokazać element główny i wszystkie elementy podrzędne, aby wskazać relację "jeden do wielu" w dobry sposób. Oczywiście musisz odpowiednio napisać swój adapter, aby obsłużyć tę sprawę.

1

Jeśli dane tabeli dziecko nie musi być sprawdzony osobno a następnie można umieścić te dane w tabeli głównej, używając coś podobnego notacji JSON i następnie zanalizować go wewnątrz metody Bindview dla CursorAdapter. Może to powodować problemy z wydajnością w zależności od złożoności danych w tabeli podrzędnej. Ale to pozwoliłoby ci używać pojedynczego kursora.

Innym rozwiązaniem, które można wykonać, jest utworzenie obiektu DAO, który uruchomił zapytanie surowe jako łączenie (otrzymujemy wiele wierszy), a następnie przetwarza kursor na listę, w której Foo jest POJO reprezentującym dane. (lub uruchom zapytania n + 1 - zapytanie główne, a następnie zapytanie podrzędne dla każdego wiersza). Następnie stwórz program ładujący, który wywoła DAO w celu zwrócenia listy i użyje z niej obiektu ListAdapter. Twój niestandardowy program ładujący nadal może rejestrować powiadomienia o zmianie danych i przeprowadzać ponowne ładowanie. Użyłem CursorLoader jako wzorca do tworzenia własnych ładowarek, które ładują się ponownie, gdy nie chcę zepsuć kursora w ListView i działa dobrze.

+0

3 lata później i nadal nie mogę znaleźć lepszego podejścia do tego problemu. Twoja sugestia użycia kolumny w tabeli nadrzędnej do przechowywania reprezentacji json danych potomnych działa dobrze dla mojego przypadku użycia. Mój jeden-do-wielu jest od 1 do "garści", więc czas serializacji od zbierania do tablicy json jest dość minimalny, podobnie jak przestrzeń potrzebna do przechowywania ciągu. Nadal przechowuję rekordy podrzędne w osobnej tabeli, aby w razie potrzeby ułatwić wysyłanie zapytań. Dziękuję za sugestię. – Mario

+0

Dzięki za komentarz. Miło wiedzieć, że pomagam! Nadal używam tego podejścia jako prostego sposobu przechowywania danych podrzędnych. Przyjęta odpowiedź jest również dobra, zwłaszcza jeśli dane prezentowane są w widoku listy rozwijanej. – harmanjd

0

Jeśli chcesz uzyskać zagregowane dane z tabeli podrzędnej, należy użyć „grupy przez” w sql statements.for przykład dwie tabele:

parent(id,name) 
child(id,parentId,age) 

Aby zapytać wszystkich rodziców z najstarszym dzieckiem:

select a.id,a.name,max(b.age) 
from parent as a inner join child as b on a.id=b.parentId 
group by a.id,a.name 
Powiązane problemy