2011-09-29 10 views
6

Aby wdrożyć dostęp do bazy danych w mojej aplikacji następnie Lars Vogel tutorial, ale jestem bardzo pomylić o kilka rzeczy ...Kilka pytań o SQLite kursorów bazy danych w Android

1) każdym razem połączenie jest wykonane do fetchTodo nowy kursor zostanie utworzony i zwrócony. Pozostawienie poprzedniego kursora dla śmieciarza. Tak więc, jeśli nie używam startManagingCursor lub nawet CursorLoader, czy powinienem zadzwonić do .close() na kursorze, gdy skończę? Poza fetchTodo zakresie oczywiście, przykład:

Cursor cursor = mNotesAdapter.fetchTodo(); 
// do something... 
cursor.close(); 

Skończyłam z tym kursorem a nowy zostanie utworzony na następny pobrać, należy zamknąć go w ten sposób wtedy czy mam zostawić to dla śmieciarza ? Chociaż myślę, że mówię o 2 rzeczach zupełnie różnych ... Wskaż, czy powinienem zamknąć to tak, jak w powyższym przykładzie, czy nie?

2)Cursor ma także sposób .deactivate() i dokumentacja mówi, że wykorzystuje mniej zasobów (ponad aktywnych kursorów). Kiedy dokładnie powinienem tego użyć? Na przykład w mojej aplikacji mam ListActivity, który jest zapełniany przez SimpleCursorAdapter (inicjalizacja kodu jest nazywana tylko raz). Używany kursor jest zmienną składową klasy, ponieważ potrzebuję jej poza metodą wypełniającą listę. Potrzebuję go do żądania bazy danych, gdy coś zostanie z niej usunięte. Ale dopóki rekord nie zostanie usunięty, co jest działaniem użytkownika i może trochę potrwać, czy powinienem w międzyczasie wyłączyć kursor? Powoduje, że będzie ponownie aktywny, gdy ponownie zadzwonię pod numer .requery(). Lub SimpleCursorAdapter przestanie działać, ponieważ kursor nie jest aktywny?

EDIT: Właśnie ten jeden przetestowane i okazało się, że nie mogę zadzwonić deactivate() po skonfigurowaniu adapter kursora. Lista będzie pusta, jeśli kursor nie jest aktywny, więc musi pozostać aktywny tak długo, jak wyświetla się ListActivity. Koniec końców, powinniśmy po prostu pozwolić, aby StartManagingCursor go obsłużył. Lub nowy CursorLoader.

3) wiem, że startManagingCursor/stopManagingCursor są przestarzałe, ale nie jestem kierowania Honeycomb (przynajmniej na razie) i nie chcemy mieć do czynienia z nowym CursorLoader teraz. Ale w powyższym samouczku startManagingCursor jest używany wszędzie, ale stopManagingCursor nigdy nie jest wywoływany raz. Dlaczego nie? Czy Android radzi sobie z tym w swój własny sposób? Każda sytuacja, którą powinienem nazwać stopManagingCursor?

Odpowiedz

9

Edycja: Zaktualizowany odpowiedź odzwierciedlać aktualne Pytanie 1:

1) Za każdym razem połączenie jest wykonane na fetchTodo nowy kursor zostanie utworzony i zwrócony. Pozostawienie poprzedniego kursora dla śmieciarza. Tak więc, jeśli nie używam programu startManagingCursor lub nawet CursorLoader dla , czy to ważne, czy powinienem wywołać funkcję .close() na kursorze, gdy skończę z ?

Tak, zdecydowanie powinni albo powiedzieć Android do startManagingCursor() użyć LoaderManager/CursorLoader lub close() to sam. Niewykonanie tej czynności spowoduje wyciek pamięci, a GC nie pomoże, ponieważ istnieją zasoby natywne za Cursor (np. Obsługa plików w bazie danych).

2) Kursor ma także sposób .deactive() i dokumentacja mówi, że wykorzystuje mniej zasobów (ponad aktywnych kursorów). Kiedy dokładnie powinienem użyć tego? ...

EDIT do innych czytelników: PO znaleźć odpowiedź i zamieścił go w swoim pytaniu. Wciąż pozostaje:

Nigdy nie używałem deactivate() (nie ma deactive()), może ktoś inny może to wyjaśnić. Jeśli chcesz naprawdę bezbolesne żądania/aktualizacje, sprawdź ramę LoaderManager - nie tylko dla Honeycomb: używając biblioteki compat możesz użyć LoaderManager (i Fragments) do wersji 1.6. Nie tylko jest to mniej kodu do pisania, ale całkowicie odciąża te rzeczy na Androida, o wiele bardziej niż startManagingCursor().

EDIT2: Kilka uwag na temat LoaderManager

Istnieje LoaderManager tutoriali na developer.android.com ale są dość ... skomplikowane i trudne do zrozumienia po raz pierwszy jak większość tamtejszych samouczków. Musiałam też dużo kopać, najlepszy do tej pory stop all-in-one, jaki znalazłem, to http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/ (plus wszystkie źródła javadocs i compat lib, które możesz znaleźć) - sposób w jaki działa LoaderManager jest bardzo podobny do (teraz także przestarzałe, zastąpione przez DialogFragment) zarządzane dialogi z ich metodami, w których po prostu mówisz Androidowi, aby "pokazał dialog # 123", a następnie Android wywoła twój kod z tym ID; to samo dotyczy ładowarek: "load loader # 123", połączenia z systemem Android pod numerem onCreateLoader().

Jedyną oczywistą wadą jest początkowo, że LoaderManager opiera się głównie na strukturze ContentProvider i niektórzy ludzie naprawdę tego nie lubią. Oczywiście, jest to dodatkowa nauka i kod, ale gdy już masz ContentProvider dla własnych danych (nawet jeśli są używane tylko prywatnie w twojej aplikacji), wszystkie dane do wyświetlenia bindng są proste z CursorLoader. IMHO, jest mała różnica między toczenia własne „dostawcy treści” i faktycznie realizacji ContentProvider - ale to tylko moja opinia :) wysoce kontrowersyjne

3) Wiem, że startManagingCursor/stopManagingCursor są przestarzałe ale jestem nie celuję w Honeycomb (przynajmniej na razie) i I nie chcę na razie zajmować się nowym CursorLoader. Ale w powyższym samouczku startManagingCursor jest używany wszędzie, ale stopManagingCursor nigdy nie jest wywoływany raz. Dlaczego nie? Czy Android zajmuje się tym na swój własny sposób? Każda sytuacja, którą powinienem nazwać stopManagingCursor?

Po wywołaniu startManagingCursor(), Cursor nie jest już Twoim problemem. Android zatroszczy się o zamknięcie kursora, gdy twój Activity zostanie zniszczony (użytkownik odejdzie, zmiana orientacji, ...). Nie musisz dopasowywać połączenia do numeru startManagingCursor(), dzwoniąc pod numer stopManagingCursor() - zwykle nie chcesz ponownie brać na siebie ciężaru zarządzania numerem Cursor, gdy się go pozbędziesz.

+0

# 1 Całkowicie źle zinterpretowałem moje myśli na temat tego pytania, będę musiał je przeformułować ... # 2 Tak, miałem na myśli "dezaktywować" (literówka). Naprawdę nie mogę znaleźć żadnej dobrej dokumentacji dotyczącej używania 'LoaderManager', nawet tutaj, w pytaniach SO.# 3 Rozumiem, ale jeśli nie powinienem używać 'stopManagingCursor', jeśli wykonałem połączenie z' startManagingCursor', dlaczego ta metoda istnieje w ogóle? –

+0

Właśnie przepisałem całe pytanie # 1 @philipp, jeśli mógłbyś spojrzeć ... –

+0

Również znalazłem odpowiedź na # 2; pytanie ponownie edytowane z odpowiedzią. –

Powiązane problemy