7

Ho un metodo personalizzato save() nella mia classe ContentProvider personalizzata MyContentProvider che desidero chiamare tramite ContentResolver. L'obiettivo è passare un POJO come pacchetto fino a MyContentProvider.Come si chiama il metodo personalizzato in ContentProvider tramite ContentResolver e si accede a Bundle in seguito?

Sto utilizzando il metodo call come indicato here e definito here.

Non ho alcun errore. Il metodo non è accessibile.

L'(abbreviato), ContentProvider personalizzato con il metodo personalizzato assomiglia a questo:

public class MyContentProvider extends ContentProvider { 

    public void save() { 

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

io lo chiamo così:

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

Perché il metodo save mai chiamati e se ottengo a questo punto, come posso accedere all'uriato chiamato e al bundle nel metodo save()? Non ho trovato alcun riferimento per questo ovunque su SO o sul web.

Grazie per le vostre risposte!

+2

devi sovrascrivere il metodo di chiamata nel tuo CP ... e poi chiamare la funzione salva da lì ... – Selvin

+0

@Selvin Funziona! Grazie. Se lo aggiungi come risposta, lo accetto. – OpenHaus

risposta

16

Ho appena giocato con questo per far funzionare una funzione personalizzata. Come notato nel commento alla tua domanda, la chiave è l'implementazione del metodo call() nel provider di contenuti per gestire i vari metodi si potrebbe passare

mia chiamata al ContentResolver assomiglia a questo:.

ContentResolver cr = getContentResolver(); 

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

All'interno del ContentProvider, ho implementato la funzione di chiamata e controllare il nome del metodo in passato:

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

che sembra funzionare.

+0

Si noti che il confronto delle stringhe sopra dovrebbe essere fatto con method.equals() piuttosto che ==. – NigelK

+0

Grazie a @nigelk, ho corretto la mia risposta. – Andrew

+1

Un altro commento, il metodo di chiamata è disponibile solo in API di livello 11 e superiori. – Andrew

-2

Se si desidera ridefinire il proprio ContentProvider, è necessario eseguire l'override questi metodo:

  • onCreate()
  • query()
  • delete()
  • inserto()
  • update()
  • getType()

Ma il metodo save() non è all'interno del ciclo di vita di un ContentProvider e non può essere chiamato.

+0

Sopra è solo una versione abbreviata della mia classe ContentProvider personalizzata. Tutti i metodi citati sono lì. Si prega di vedere i miei riferimenti. È possibile definire e chiamare metodi personalizzati. Avrei preferito chiedere come dovrebbe apparire la firma del metodo personalizzato. – OpenHaus

Problemi correlati