7

Mam niestandardową metodę save() w mojej niestandardowej klasy ContentProvider MyContentProvider, którą chcę wywołać za pomocą ContentResolver. Celem jest przekazanie POJO jako pakietu do MyContentProvider.Jak wywołać metodę niestandardową w ContentProvider za pośrednictwem ContentResolver i uzyskać dostęp do pakietu później?

Używam metody call jak wspomniano here i zdefiniowano here.

Nie otrzymuję żadnych błędów. Ta metoda nie jest dostępna.

The (skrócone), niestandardowe ContentProvider metodą niestandardową wygląda następująco:

public class MyContentProvider extends ContentProvider { 

    public void save() { 

     Log.d("Test method", "called"); 
    } 
} 

nazywam go tak:

ContentResolver contentResolver = context.getContentResolver(); 
Bundle bundle = new Bundle(); 
bundle.putSerializable("pojo", getPojo()); 
contentResolver.call(Contracts.CONTENT_URI, "save", null, bundle); 

Dlaczego nigdy metoda save zadzwonił i jeśli dostanę do tego momentu, w jaki sposób uzyskać dostęp do nazwanego Uri i pakietu w metodzie save()? Nie mogłem znaleźć żadnego odniesienia do tego nigdzie na SO lub w Internecie.

Dziękuję za odpowiedzi!

+2

musisz nadpisać metodę połączenia w swoim CP ... a następnie zadzwonić z funkcji zapisz stamtąd ... – Selvin

+0

@Selvin To działa! Dziękuję Ci. Jeśli dodasz to jako odpowiedź, przyjmuję to. – OpenHaus

Odpowiedz

16

Właśnie bawiłem się tym, aby uzyskać funkcjonalność niestandardową. Jak zauważono w komentarzu do Twojego pytania, kluczowe jest wdrożenie metody w dostawcy treści obsłużyć różne metody call() można przekazać w

Moje wezwanie do ContentResolver wygląda następująco:.

ContentResolver cr = getContentResolver(); 

cr.call(DBProvider.CONTENT_URI, "myfunction", null, null); 

Wewnątrz ContentProvider, mam zaimplementowane funkcje połączeń i sprawdzić nazwę metody przekazywane w:

@Override 
public Bundle call(String method, String arg, Bundle extras) { 
    if(method.equals("myfunction")) { 
     // Do whatever it is you need to do 
    } 
    return null; 
} 

, który wydaje się działać.

+0

Należy zauważyć, że powyższe porównanie łańcuchów powinno zostać wykonane za pomocą metody method.equals() zamiast ==. – NigelK

+0

Dzięki @nigelk, poprawiłem swoją odpowiedź. – Andrew

+1

Jeden inny komentarz, metoda połączenia jest dostępna tylko na poziomie interfejsu API 11 i nowszych. – Andrew

-2

Jeśli chcesz przedefiniować swoją ContentProvider, trzeba zastąpić te metody:

  • onCreate()
  • zapytanie()
  • delete()
  • insert()
  • aktualizacja()
  • getType()

Ale metoda save() nie znajduje się w cyklu życia dostawcy treści i nie można jej wywołać.

+0

Powyżej to tylko skrócona wersja mojej niestandardowej klasy ContentProvider. Wszystkie wymienione metody są dostępne. Proszę zobaczyć moje referencje. Możliwe jest definiowanie i wywoływanie metod niestandardowych. Powinienem raczej zapytać, jak powinien wyglądać podpis niestandardowej metody. – OpenHaus

Powiązane problemy