7

Ich habe eine benutzerdefinierte Methode save() in meiner benutzerdefinierten ContentProvider-Klasse MyContentProvider, die ich über den ContentResolver aufrufen möchte. Ziel ist es, einen POJO als Bundle an MyContentProvider zu übergeben.Wie rufe ich benutzerdefinierte Methode in ContentProvider durch ContentResolver und Zugriff danach Bundle?

Ich verwende die call Methode wie erwähnt here und definierte here.

Ich bekomme keine Fehler. Auf die Methode wird gerade nicht zugegriffen.

Die (verkürzte), kundenspezifische Contentprovider mit der benutzerdefinierten Methode sieht wie folgt aus:

public class MyContentProvider extends ContentProvider { 

    public void save() { 

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

ich es so nennen:

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

Warum ist die save Methode nie aufgerufen und wenn ich zu diesem Punkt, wie greife ich auf das aufgerufene Uri und das Bündel in der Methode save()? Ich konnte nirgendwo auf SO oder im Internet eine Referenz finden.

Vielen Dank für Ihre Antworten!

+2

Sie müssen Call-Methode in Ihrem CP überschreiben ... und rufen Sie dann Funktion von dort speichern ... – Selvin

+0

@Selvin Das funktioniert! Vielen Dank. Wenn Sie es als Antwort hinzufügen, akzeptiere ich es. – OpenHaus

Antwort

16

Ich habe gerade damit gespielt, um eine benutzerdefinierte Funktion arbeiten zu lassen. Wie bereits im Kommentar zu Ihrer Frage erwähnt, ist der Schlüssel für die Methode call() in dem Content-Provider die Umsetzung der einzelnen Methoden behandeln Sie in passieren könnte

zum ContentResolver Mein Aufruf sieht wie folgt aus:.

ContentResolver cr = getContentResolver(); 

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

Innerhalb des Contentprovider, habe ich die Anruffunktion implementiert und die Methodennamen in geben überprüfen:

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

das scheint zu funktionieren.

+0

Beachten Sie, dass der obige Zeichenfolgenvergleich mit method.equals() und nicht mit == erfolgen sollte. – NigelK

+0

Dank @nigelk, ich habe meine Antwort korrigiert. – Andrew

+1

Ein weiterer Kommentar, die Aufrufmethode ist nur in API-Ebene 11 und höher verfügbar. – Andrew

-2

Wenn Sie Ihre eigene Contentprovider neu zu definieren, müssen Sie diese Methode überschreiben:

  • onCreate()
  • query()
  • löschen()
  • insert()
  • update()
  • getType()

Die Methode save() befindet sich jedoch nicht im Lebenszyklus eines ContentProviders und kann nicht aufgerufen werden.

+0

Oben ist nur eine verkürzte Version meiner benutzerdefinierten ContentProvider-Klasse. Alle erwähnten Methoden sind da. Bitte beachten Sie meine Referenzen. Es ist möglich benutzerdefinierte Methoden zu definieren und aufzurufen. Ich hätte lieber gefragt, wie die Signatur der benutzerdefinierten Methode aussehen sollte. – OpenHaus