2012-08-10 8 views
15

Possiedo un ContentProvider che gestisce tutti i dati di inserimento e recupero relativi alla mia applicazione, sto seguendo lo schema suggerito da Virgil Dobjanschi su Google I/O. Sto usando il primo schema.Best practice per unire tabelle e notifiche ContentObservers in ContentProvider Android

Il mio problema è che ho un'entità logica rappresentata da più tabelle nel database.

Ad esempio, ho una tabella Articoli e una tabella ArticleExtras. Articoli rappresenta l'articolo stesso, mentre ArticleExtras rappresenta informazioni aggiuntive su determinati articoli, come il numero di commenti.

Ho utilizzato CursorAdapter nell'interfaccia utente per visualizzare il titolo dell'articolo e il numero di commenti di quell'articolo in una riga di ListView.

Per implementarlo, ho aggiunto un'istruzione left outer join ArticleExtras on nel metodo di query ContentProvider per la tabella Articoli, in modo che CursorAdapter possa ottenere ArticoloExtras insieme all'articolo stesso.

Quando i nuovi articoli vengono recuperati dal Web, li inserisco nel database tramite ContentProvider, quindi il CursorAdapter viene notificato e aggiorna l'interfaccia utente, questa parte ha funzionato come previsto.

Ma quando ho recuperato il numero di commenti (ArticleExtras), desidero ricevere lo stesso CursorAdapter, che sta osservando le modifiche nello content://com.myapp.content/Articles, in modo da poter aggiornare la mia riga in ListView.

La mia implementazione attuale è la seguente: Dopo aver inserito ArticleExtras nel database, avvio una nuova query per verificare se la tabella Articoli ha delle righe correlate all'articoloExtras che ho appena inserito. In tal caso, creerò un nuovo uri per tale articolo (ad esempio: content://com.myapp.cotent/Articles/123) e chiamo getContext().getContentResolver().notifyChange(uri, null), pertanto il CursorAdapter corrispondente che sta guardando per le modifiche di questo articolo riceverà una notifica.

L'approccio è corretto oppure esiste un modo migliore per implementare ciò che voglio?

risposta

5

Checkout ContactsProvider2, in esso impostano la notifica uri allo AUTHORITY_URI che sembra essere un tutto per gli altri URI nel provider. Ho avuto lo stesso problema e l'ho provato io stesso per un provider con più tavoli e join su quei tavoli, e funziona perfettamente.