Autore Topic: Content provider : molta confusione.  (Letto 398 volte)

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Content provider : molta confusione.
« il: 06 Marzo 2014, 10:19:11 CET »
0
Ciao a tutti,
sono molto confuso riguardo a quale sia il modo migliore per gestire la persistenza dei dati su un'app Android.
I dati da gestire a volte sono relativamente complessi, quindi in questi casi ho deciso di utilizzare un DB Sqlite.
Quando ho cominciato a sviluppare su Android ero contento del fatto che fosse possibile utilizzare un ORM ( OrmLite ) per effettuare il mapping con il model e per avere una libreria che mi permettesse di effettuare query più comodamente.
In seguito ho scoperto l'esistenza dei ContentProvider e del fatto che è consigliabile utilizzarli, per vari motivi, anche quando non si ha la necessità di condividere i dati con altre applicazioni ( correggetemi se sbaglio ).
Il problema è che non ho trovato un modo per conciliare OrmLite con i ContentProvider.

Nel caso di dati relativamente semplici e con poche relazioni tra le varie entità, tutto sommato va bene. Ma quando si cominciano ad avere più tabelle e si ha la necessità di effettuare JOIN e query complesse, avere a che fare con Provider, URI, Cursor ecc... diventa difficile.
Una cosa che ho trovato particolarmente difficile e alla quale non ho trovato ancora una soluzione decente è la gestione delle transazioni.
Per gestire le transazioni a livello di ContentProvider, viene messa a disposizione la classe ContentProviderOperation.
Da quanto ho capito, utilizzando applyBatch() a una serie di ContentProviderOperation, quando una di queste va male, il ContentProvider si occupa di effettuare il rollback.
Il problema sta nel fatto che se io volessi manipolari i dati derivanti da una delle operazioni intermedie, prima che venga committata la transazione, magari per dare l'input a un'altra operazione, la cosa diventa molto difficile. Viene messo a disposizione un sistema di backReference, ma è davvero scomodo e in realtà non sono riuscito ad utilizzarlo in tutti i casi ( a volte dovendo rinunciare all'atomicità ).
Tutto questo secondo me contribuisce a generare del codice poco leggibile e inutlimente complicato.

Voi cosa ne pensate? Che architettura utilizzate quando dovete memorizzare dei dati relativamente complessi?
Esiste la possibilità di utilizzare OrmLite e ContentProvider insieme?

iClaude

  • Visitatore
Re:Content provider : molta confusione.
« Risposta #1 il: 06 Marzo 2014, 10:26:37 CET »
0
Personalmente, se non c'è la necessità di condividere il database con altre app, evito i ContentProvider, che hanno una gestione che dire complicata è dire poco...

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Content provider : molta confusione.
« Risposta #2 il: 06 Marzo 2014, 16:14:45 CET »
0
Grazie per la risposta IClaude, ma sono ancora convinto che ci siano dei vantaggi nell'utilizzare i ContentProvider anche quando non ci sia la necessita di condividere il DB.
Alcuni motivi sono : l'astrazione dalla sorgente dati, l'utilizzo dei SyncAdapter, la facilità di utilizzo con i CursorLoader, la gestione automatica della connessione al DB sottostante, la possibilità di implemnetare facilmente le funzionalità di ricerca e suggerimenti dei contenuti. Poi se un giorno si decidesse di esporre i dati ad un'altra applicazione, sarebbe immediato farlo.

Il problema è che mi sembra troppo macchinoso e complicato scrivere un ContentProvider quando si hanno più tabelle. Non ho trovato un buon esempio su come fare query con JOIN su più tabelle. L'unico modo che ho trovato è quello di definire una URI apposita per le query più complesse. Tuttavia ho letto che bisognerebbe tendere a utilizzare ogni URI per identificare una singola tabella.
Inoltre, prima di passare su Android, sono sempre stato abituato a utilizzare un Model che rispecchiasse la struttura del DB e con il quale riempire la view. La mia domanda è questa : l'approccio con i ContentProvider lo esclude ( perché spinge ad usare solo i Cursor )  o si possono combinare entrambi gli approcci?