Slide 1

Slide 1 text

ContentProvider The Good, the Bad and the Ugly

Slide 2

Slide 2 text

Erste Reaktionen

Slide 3

Slide 3 text

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.“

Slide 4

Slide 4 text

Clients

Slide 5

Slide 5 text

Clients Zahlreiche Standard-Provider Indirekter Zugriff Pseudorelationales Datenmodell

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

ContentResolver Realisiert indirekte Nutzung Über den Context zugänglich CRUD-Methoden Batch-Methoden Methoden für Zugriff auf Binärdaten

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Datensatz abfragen

Slide 11

Slide 11 text

Pseudorelational Orientiert sich am relationalen Modell Aber: Nicht so mächtig Keine Joins, Unions, Limits Unions mit MergeCursor abbildbar

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Datensatz verändern

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Code

Slide 16

Slide 16 text

Loader Asynchrones Laden von Daten Automatische Aktualisierung (teilweise) Berücksichtigen Lebenszyklus ContentProvider Hauptziel

Slide 17

Slide 17 text

ContentObserver Observer-Pattern Benachrichtigung bei Änderungen Leider zu unspezifisch Abhängig vom Provider

Slide 18

Slide 18 text

Fazit Clients Hässlich Nicht mächtig genug Aber unverzichtbar Loader/ContentObserver bieten Vorteile

Slide 19

Slide 19 text

Provider

Slide 20

Slide 20 text

Provider ● Subklasse von ContentProvider erzeugen ● Contract-Klasse erstellen ● UriMatcher ● CRUD Methoden implementieren ● Optional: applyBatch() ● Provider in AndroidManifest.xml eintragen

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Contract-Klasse Definieren Sie alles, was der Client braucht – Bspw. auch Intents – Notwendige Permissions Exportierte Struktur != reale Struktur Bieten Sie Joins an

Slide 23

Slide 23 text

UriMatcher Hilfsklasse zum Matchen von URIs Statisch definieren Statisch initialisieren In jeder CRUD-Methode nutzen

Slide 24

Slide 24 text

Code

Slide 25

Slide 25 text

CRUD-Methoden Wie beim Client: query(), update()... Nutzen UriMatcher Parameter ebenso gleich Hilfsklasse SQLiteQueryBuilder für query()

Slide 26

Slide 26 text

Code

Slide 27

Slide 27 text

Manifest-Datei Klasse Authority Export Rechte

Slide 28

Slide 28 text

Manifest-Datei

Slide 29

Slide 29 text

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).“

Slide 30

Slide 30 text

Generator Stets gleichen Code generieren lassen Anpassung zumeist notwendig Eigenbeitrag: – Datenmodell – Manifest-Eintrag

Slide 31

Slide 31 text

Fazit Provider Viel Standard-Code Generator vereinfacht Prozess Ermöglicht Daten frei zu geben

Slide 32

Slide 32 text

The Ugly Code teilweise wenig ansehnlich Nicht objektorientiert Boilerplate Code DAO-Bibliotheken mögliche Alternative

Slide 33

Slide 33 text

The Bad Nicht ausdrucksstark – Vor allem: keine Joins Permissions nur up-front – OAuth-Modell wünschenswert

Slide 34

Slide 34 text

The Good Ideal für Datenaustausch Für Clients unverzichtbar Für Suchvorschläge notwendig Standardvorgehen in Android Gute Integration

Slide 35

Slide 35 text

https://plus.google.com/101948439228765005787/ https://www.twitter.com/RittmeyerW http://www.grokkingandroid.com http://www.grokkingandroid.com/contentprovider