Save 37% off PRO during our Black Friday Sale! »

ContentProvider - The Good, the Bad and the Ugly

ContentProvider - The Good, the Bad and the Ugly

This is a presentation I held at the MobileTechCon 2013 conference in Berlin.

D0ed2f28dd13ddfb192ebe198623924c?s=128

Wolfram Rittmeyer

September 04, 2013
Tweet

Transcript

  1. ContentProvider The Good, the Bad and the Ugly

  2. Erste Reaktionen

  3. Basis für Datenaustausch „Content providers manage access to a structured

    set of data. They encapsulate the data, and provide mechanisms for defining data security. Content providers are the standard interface that connects data in one process with code running in another process.“
  4. Clients

  5. Clients Zahlreiche Standard-Provider Indirekter Zugriff Pseudorelationales Datenmodell

  6. Standard-Provider Name API-Level Wozu Browser 1 Websuchen, Bookmarks und Browser-Verlauf

    CalendarContract 14 Kalender und Termine CallLog 1 Telefonhistorie Contacts 1 Alter Provider für Kontakte. Deprecated! ContactsContract 5 Neuer Provider für Kontakte MediaStore 1 Alle Mediendaten wie Bilder, Musik, Videos UserDictionary 3 Nutzerwörterbuch
  7. Content URIs content://authority/pfad/id content://de.openminds.samples.cpsample.lentitems/items/15 Schema content fix Authority de.openminds. samples.cpsample.

    lentitems Eindeutig für einen Provider Pfad items Entspricht zumeist einer logischen Tabelle Id 15 Die ID eines konkreten Datensatzes
  8. ContentResolver Realisiert indirekte Nutzung Über den Context zugänglich CRUD-Methoden Batch-Methoden

    Methoden für Zugriff auf Binärdaten
  9. Datensatz abfragen Nutzung der query()-Methode Argumente: Typ Name Bedeutung URI

    uri Die abzufragende URI String[] projection Die benötigten Spalten String selection Eine WHERE-Klausel String[] selectionArgs Binding-Parameter für das selection-Argument String sortorder Die ORDER BY-Klausel
  10. Datensatz abfragen

  11. Pseudorelational Orientiert sich am relationalen Modell Aber: Nicht so mächtig

    Keine Joins, Unions, Limits Unions mit MergeCursor abbildbar
  12. Datensatz verändern Am Beispiel der update()-Methode insert() und delete()-Methoden analog

    Argumente: Typ Name Bedeutung URI uri Die zu verändernde URI ContentValues values Die benötigten Spalten String selection Eine WHERE-Klausel String[] selectionArgs Binding-Parameter für das selection-Argument
  13. Datensatz verändern

  14. applyBatch() Ermöglicht Batch-Abläufe Erwartet ArrayList von ContentProviderOperation-Objekten Performance-Gewinn Nur für

    eine Authority
  15. Code

  16. Loader Asynchrones Laden von Daten Automatische Aktualisierung (teilweise) Berücksichtigen Lebenszyklus

    ContentProvider Hauptziel
  17. ContentObserver Observer-Pattern Benachrichtigung bei Änderungen Leider zu unspezifisch Abhängig vom

    Provider
  18. Fazit Clients Hässlich Nicht mächtig genug Aber unverzichtbar Loader/ContentObserver bieten

    Vorteile
  19. Provider

  20. Provider • Subklasse von ContentProvider erzeugen • Contract-Klasse erstellen •

    UriMatcher • CRUD Methoden implementieren • Optional: applyBatch() • Provider in AndroidManifest.xml eintragen
  21. Contract-Klasse Der Begriff Vertrag ist bewusst gewählt Definiert Zugriffskonstanten für

    Client Für jede logische Tabelle eine innere Klasse – Für jede Spalte eine Konstante – ContentURI-Konstante – ContentTypes-Konstanten
  22. Contract-Klasse Definieren Sie alles, was der Client braucht – Bspw.

    auch Intents – Notwendige Permissions Exportierte Struktur != reale Struktur Bieten Sie Joins an
  23. UriMatcher Hilfsklasse zum Matchen von URIs Statisch definieren Statisch initialisieren

    In jeder CRUD-Methode nutzen
  24. Code

  25. CRUD-Methoden Wie beim Client: query(), update()... Nutzen UriMatcher Parameter ebenso

    gleich Hilfsklasse SQLiteQueryBuilder für query()
  26. Code

  27. Manifest-Datei Klasse Authority Export Rechte

  28. Manifest-Datei

  29. Daten freigeben Ermöglicht REST auf Android Zitat von Cyril Mottier

    auf Google+: „Uri are only here to fulfill the Android original leitmotiv: being able to share data from one process to another (usually via ContentProvider).“
  30. Generator Stets gleichen Code generieren lassen Anpassung zumeist notwendig Eigenbeitrag:

    – Datenmodell – Manifest-Eintrag
  31. Fazit Provider Viel Standard-Code Generator vereinfacht Prozess Ermöglicht Daten frei

    zu geben
  32. The Ugly Code teilweise wenig ansehnlich Nicht objektorientiert Boilerplate Code

    DAO-Bibliotheken mögliche Alternative
  33. The Bad Nicht ausdrucksstark – Vor allem: keine Joins Permissions

    nur up-front – OAuth-Modell wünschenswert
  34. The Good Ideal für Datenaustausch Für Clients unverzichtbar Für Suchvorschläge

    notwendig Standardvorgehen in Android Gute Integration
  35. https://plus.google.com/101948439228765005787/ https://www.twitter.com/RittmeyerW http://www.grokkingandroid.com http://www.grokkingandroid.com/contentprovider