2012-10-26 26 views

Odpowiedz

55

Po prostu natknąłem się na ten sam problem z powodu raportu awarii użytkownika, który otrzymałem dzisiaj za moją aplikację. Jeśli dokumentacja na Androida jest niejasna, pomaga spojrzeć na kod źródłowy. To co znalazłem na temat przyczyn dla ContentResolver.query() powrocie null:

  1. Dostawca treści nie mogą być nabywane. Może to wynikać z problemu z określonym Uri lub po prostu nie istnieje w systemie. Jeśli problemem jest Uri, przyczyną są: protokół nie jest content:// lub Uri nie ma części autorytatywnej (Uri.getAuthority() == null).

  2. Zakupiony dostawca usług query method sam w sobie zwraca null.

  3. Można uzyskać dostawcę treści, ale podczas kwerendy został zgłoszony kod RemoteException.

Zwłaszcza z powodu (2.) to całkiem dużo arbitralne, co może być przyczyną null wskutek ponieważ nie istnieją żadne reguły zdefiniowane. Ale zwykle, jeśli SQLite jest back-endem ContentProvider, możesz spodziewać się co najmniej jakiegoś pustego obiektu Cursor zamiast tylko null.

System Android ContentProvider s wykonają jednak pewne kontrole, zanim zwrócą cokolwiek. Jeśli dane wejściowe nie są zgodne z oczekiwaniami, istnieje prawdopodobieństwo, że zostanie zwrócone null. Ale szczerze mówiąc, nigdy wcześniej mi się to nie zdarzało. Zwykle otrzymuję numer IllegalArgumentException w przypadku problemów z parametrami zapytania. Może niektóre implementacje ContentProvider zwracają null w przypadku pustych zestawów wyników.

Tak czy inaczej. Wydaje się konieczne, aby zawsze sprawdzać pod kątem wartości zerowej. Szczególnie numer przyczyny (3.) jest prawdopodobnie czymś, co może się zdarzyć na dowolnym urządzeniu z systemem Android.

+0

Jakże kulawy, że zawsze powinniśmy sprawdzić wartość zerową z powodu czegoś, co zdarza się bardzo rzadko (przypadek 3). – RestInPeace

+0

W moim przypadku link był 'contnet: // XXX' zamiast' content: // XXX', dammm –

-2

Jeśli nie ma wyniku, zwraca wartość null. Mam na myśli powiedzieć, że jeśli dane zapytanie bazy danych nic nie wyniknie (nawet jeden wiersz danych), to query() zwraca null.

+1

Myślałem, że wcześniej odzyskałem puste obiekty kursora, ale mógłbym się pomylić ... czy widziałeś to w jakimś pół-oficjalnym miejscu? – Salis

+0

Nie. Zawsze miałem dane testowe. – Charan

+0

Nie zwraca "null", jeśli nie ma wyniku. Zwraca tylko pusty kursor. – efeyc

5

zwraca zero, jeśli schemat URI nie ma postaci content:// lub jeśli contentProvider dla samego schematu nie istnieje.

3

ContentResolver.query() zwróci wartość null w następujących przypadkach:

  1. Jeśli próbujesz przekazać nazwy kolumn, które nie istnieje w bazie danych (bardzo częsty przypadek, gdy deweloperzy użyć stałe jako kolumny o nazwach , ponieważ wyglądają podobnie do kolumn).

  2. Prawdopodobnie ma wartość null, ponieważ Twój argument URI jest nieprawidłowy.

Mogą być też inne przypadki, w których zwróci wartość null. Jednak powyższe dwa przypadki są bardzo częstym powodem, dla którego programiści ściągają włosy :)

1

Jeśli zapomnisz zadeklarować dostawcę w manifeście, twoje zapytania mogą zwrócić wartość null.

2

Miałem ten sam problem. Mój błąd polegał na tym, aby nie zamykać kursora dla dostawcy, aby późniejsza kwerenda wywoływała wartość null.

+0

To jest ten. Jeśli nie zamkniesz kursora, następujące zapytania mogą lub nie będą działać (i ostatecznie zwrócą identyfikator URI jako wartość null). Usiadłem na tym przez godzinę, a potem zobaczyłem to. +1 – DJO

Powiązane problemy