Android innhold Providers

En innholdsleverandør komponent leverer data fra ett program til andre på forespørsel. Slike anmodninger behandles av de metodene i ContentResolver klassen. En innholdsleverandør kan bruke forskjellige måter å lagre sine data, og dataene kan lagres i en database, i filer, eller over et nettverk.
ContentProvider
noen ganger er det nødvendig å dele data på tvers av applikasjoner. Det er der innholdsleverandører bli svært nyttig.

Innholdsleverandører kan du sentralisere innhold på ett sted og har mange forskjellige applikasjoner tilgang til det som trengs. En innholdsleverandør oppfører seg omtrent som en database hvor du kan spørre den, redigere innholdet, samt legge til eller slette innhold ved hjelp av innsatsen (), oppdatere (), slett (), og spørring () metoder. I de fleste tilfeller er dette data blir lagret i en SQLite
database.

En innholdsleverandør er implementert som en underklasse av ContentProvider
klasse og må gjennomføre et standard sett med APIer som aktivere andre programmer for å utføre transaksjoner.
public class My Application strekker ContentProvider {}
Innhold URI

til å spørre en innholdsleverandør, angir du søkestrengen i form av en URI som har følgende format :
< prefiks >: //< myndighet > /< data_type > /< id >

Her er en detalj fra ulike deler av URI −
PartDescriptionprefixThis settes alltid til innhold: //authorityThis angir navnet på innholdsleverandøren, for eksempel kontakter
, leseren
etc. For tredjeparts innholdsleverandører, kan dette være det fullstendige navnet, for eksempel com.tutorialspoint.statusprovider
data_typeThis indikerer hvilken type data at denne leverandøren gir. For eksempel, hvis du får alle kontaktene fra Kontakter
innholdsleverandøren, da databanen ville være folk
og URI ville se slik ut Innhold: //kontakter /folk
idThis angir en bestemt post spurt. For eksempel, hvis du er ute etter kontakt nummer fem i Kontakter innholdsleverandøren deretter URI ville se slik ut innhold: //kontakter /folk /5

Opprett Innholdsleverandør

. Dette innebærer rekke enkle trinn for å lage din egen innholdsleverandør.

Først av alt du trenger for å lage et Content Provider klasse som utvider ContentProviderbaseclass.

For det andre må du definere innholdsleverandør URI-adresse som skal brukes til å få tilgang til innholdet.

Deretter vil du trenger for å lage din egen database for å holde innhold. Vanligvis bruker Android SQLite database og rammeverket må overstyre onCreate ()
metode som vil bruke SQLite Åpne Helper metode for å opprette eller åpne operatørens database. Når søknaden er lansert, er det onCreate ()
handler til hver av innholdsleverandørene oppfordret den viktigste applikasjonen tråden.

  • Neste må du gjennomføre innhold leverandøren spørringer til å utføre forskjellige database spesifikke operasjoner

    Til slutt melde din Innholdsleverandør i aktivitet fila med. < leverandøren > . tag

    Her er listen over de metoder som du trenger for å overstyre i Innholdsleverandør klasse å ha din Innholdsleverandør arbeids:
    ContentProvider

    < b> onCreate ()
    Denne metoden kalles når tilbyder er startet.

    spørring ()
    Denne metoden mottar en forespørsel fra en klient. Resultatet returneres som en markør objekt.

  • Sett ()
    Denne metoden setter ny rekord i innholdsleverandøren.

  • slett ()
    Denne metoden sletter en eksisterende rekord fra innholdsleverandøren.

    oppdateringen ()
    Denne metoden oppdaterer en eksisterende rekord fra innholdsleverandøren.

    getType ()
    Denne metoden returnerer med MIME-typen data på den gitte URI.
    < h2> Eksempel

    Dette eksempelet vil forklare deg hvordan du kan lage din egen ContentProvider
    . Så la oss følge følgende trinn til lik det vi fulgt under oppretting Hello World Eksempel

    StepDescription1You vil bruke Android StudioIDE å lage en Android-applikasjon, og gi det et navn som My Application Anmeldelser under en pakke com.example.My Application
    , med blank Activity.2Modify hovedaktivitet fil MainActivity.java
    å legge til to nye metoder onClickAddName () Hotell og onClickRetrieveStudents ()
    .3Create en ny java fil som heter StudentsProvider.java
    under pakken com.example.My Søknad
    å definere din faktiske leverandør og tilhørende methods.4Register innholdet leverandør i ditt AndroidManifest.xml
    fil ved hjelp av < leverandør ... /> tag 5Modify innholdet i res /layout /activity_main.xml
    filen standard for å inkludere en liten GUI for å legge til studenter records.6No må endre string.xml.Android studio ta vare på string.xml file.7Run den program for å lansere Android emulator og kontrollere resultatet av de endringer som er gjort i programmet.

    Følgende er innholdet i den modifiserte hovedaktivitet filen src /com.example.My Søknad /MainActivity.java
    . Denne filen kan inneholde hver av de grunnleggende livsløps metoder. Vi har lagt til to nye metoder onClickAddName () Hotell og onClickRetrieveStudents ()
    å håndtere brukerinteraksjon med søknaden
    pakken com.example.My Application;. Import android.net.Uri; import android.os.Bundle, import android.app.Activity, import android.content.ContentValues, import android.content.CursorLoader, import android.database.Cursor, import android.view.Menu, import android.view.View; import android.widget.EditText, import android.widget.Toast; public class MainActivity strekker Aktivitet {Override beskyttet void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); }Override Public boolean onCreateOptionsMenu (Meny menyen) {getMenuInflater () blåse (R.menu.main, meny).; return true; } Public void onClickAddName (Vis visning) {//Legg en ny student rekord ContentValues ​​verdier = nye ContentValues ​​(); values.put (StudentsProvider.NAME, ((EditText) findViewById (R.id.editText2)) GetText () toString ()..); values.put (StudentsProvider.GRADE, ((EditText) findViewById (R.id.editText3)) GetText () toString ()..); . Uri uri = getContentResolver () Sett (StudentsProvider.CONTENT_URI, verdier); Toast.makeText (getBaseContext (), uri.toString (), Toast.LENGTH_LONG) .vis (); } Public void onClickRetrieveStudents (Vis visning) {//Hent student poster String url = "innhold: //com.example.provider.College/students"; Uri studenter = Uri.parse (URL); Markør c = managedQuery (studenter, null, null, null, "navn"); if (c.moveToFirst ()) {do {Toast.makeText (dette, c.getString (c.getColumnIndex (StudentsProvider._ID)) + "," + c.getString (c.getColumnIndex (StudentsProvider.NAME)) + " "+ c.getString (c.getColumnIndex (StudentsProvider.GRADE)), Toast.LENGTH_SHORT) .vis (); } While (c.moveToNext ()); }}}

    Opprett ny fil StudentsProvider.java under com.example.My Application
    pakken og følgende er innholdet i src /com.example.My Søknad /StudentsProvider.java Anmeldelser −
    pakken com.example.My Application, import java.util.HashMap, import android.content.ContentProvider, import android.content.ContentUris, import android.content.ContentValues, import android.content.Context; import android .content.UriMatcher, import android.database.Cursor, import android.database.SQLException, import android.database.sqlite.SQLiteDatabase, import android.database.sqlite.SQLiteOpenHelper, import android.database.sqlite.SQLiteQueryBuilder; import android.net .Uri, import android.text.TextUtils; public class StudentsProvider strekker ContentProvider {statisk endelige String PROVIDER_NAME = "com.example.provider.College"; statiske endelige String URL = "innhold: //" + PROVIDER_NAME + "/studenter"; statiske endelige Uri CONTENT_URI = Uri.parse (URL); statiske endelige String _ID = "_id"; statiske endelige String NAME = "navn"; statiske endelige String GRADE = "klasse"; private static HashMap < String, String > STUDENTS_PROJECTION_MAP; statiske endelige int STUDENTER = 1; statisk final int STUDENT_ID = 2; statiske endelige UriMatcher uriMatcher; statisk {uriMatcher = new UriMatcher (UriMatcher.NO_MATCH); uriMatcher.addURI (PROVIDER_NAME, "studenter", studenter); uriMatcher.addURI (PROVIDER_NAME, "studenter /#", STUDENT_ID); } /** * Database bestemt konstant erklæringer * /private SQLiteDatabase db; statiske endelige String DATABASE_NAME = "College"; statiske endelige String STUDENTS_TABLE_NAME = "studenter"; statisk final int Database_Version = 1; statiske endelige String CREATE_DB_TABLE = "CREATE TABLE" + STUDENTS_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + "navn TEKST NOT NULL," + "grade TEKST NOT NULL);"; /** * Helper klassen som faktisk skaper og forvalter * leverandørens underliggende dataregister. * /Private static class DatabaseHelper strekker SQLiteOpenHelper {DatabaseHelper (Context kontekst) {super (sammenheng DATABASE_NAME, null, Database_Version); }Override Public void onCreate (SQLiteDatabase db) {db.execSQL (CREATE_DB_TABLE); }Override Public void ONUPGRADE (SQLiteDatabase db, int OldVersion, int newversion) {db.execSQL ("DROP TABLE IF eksisterer" + STUDENTS_TABLE_NAME); onCreate (db); }}Override Public boolean onCreate () {Context kontekst = getContext (); DatabaseHelper dbHelper = new DatabaseHelper (sammenheng); /** * Lag en skrive stand database som vil utløse sin * skapelse hvis den ikke allerede finnes. * /Db = dbHelper.getWritableDatabase (); returnere (db == null)? false: true; }Override Offentlig Uri sett (Uri uri, ContentValues ​​verdier) {/** * Legg til en ny student rekord * /lang ROWID = db.insert (STUDENTS_TABLE_NAME, "", verdier); /** * Hvis posten er lagt til * /if (ROWID> 0) {Uri _uri = ContentUris.withAppendedId (CONTENT_URI, ROWID); . getContext () getContentResolver () notifyChange (_uri, null).; returnere _uri; } Kaste nytt SQLException ("Kunne ikke legge til en post i" + uri); }Override Offentlig Markør spørre (Uri Uri, String [] projeksjon, String utvalg, String [] selectionArgs, String sortering) {SQLiteQueryBuilder qb = new SQLiteQueryBuilder (); qb.setTables (STUDENTS_TABLE_NAME); switch (uriMatcher.match (URI)) {case STUDENTER: qb.setProjectionMap (STUDENTS_PROJECTION_MAP); gå i stykker; case STUDENT_ID: qb.appendWhere (. _ID + "=" + uri.getPathSegments () får (1)); gå i stykker; standard: kaste nytt IllegalArgumentException ("Ukjent URI" + uri); } If (sortering == null || sortering == "") {/** * Som standard slag på studentnavn * /sortering = NAVN; } Markør c = qb.query (db, projeksjon, utvalg, selectionArgs, null, null, sortering); /** * Registrer deg for å se et innhold URI for endringer * /c.setNotificationUri (getContext () getContentResolver (), Uri.); returnere c; }Override Public int Slette (Uri uri, String utvalg, String [] selectionArgs) {int teller = 0; switch (uriMatcher.match (URI)) {case STUDENTER: teller = db.delete (STUDENTS_TABLE_NAME, utvalg, selectionArgs); gå i stykker; case STUDENT_ID. String id = uri.getPathSegments () får (1); telle = db.delete (STUDENTS_TABLE_NAME, _ID + "=" + id + (TextUtils.isEmpty (utvalg) "OG (" + valg + ')':!? ""), selectionArgs); gå i stykker; standard: kaste nytt IllegalArgumentException ("Ukjent URI" + uri); } GetContext () getContentResolver () notifyChange (uri, null)..; avkastning teller; }Override Public int oppdateringen (Uri uri, ContentValues ​​verdier, String utvalg, String [] selectionArgs) {int teller = 0; switch (uriMatcher.match (URI)) {case STUDENTER: teller = db.update (STUDENTS_TABLE_NAME, verdier, valg, selectionArgs); gå i stykker; case STUDENT_ID: teller = db.update (STUDENTS_TABLE_NAME, verdier, _ID + "=" + uri.getPathSegments () får (1) + (TextUtils.isEmpty (utvalg) "OG (" + valg + ') ".!?: ""), selectionArgs); gå i stykker; standard: kaste nytt IllegalArgumentException ("Ukjent URI" + uri); } GetContext () getContentResolver () notifyChange (uri, null)..; avkastning teller; }Override Offentlige String getType (Uri uri) {switch (uriMatcher.match (URI)) {/** * Få alle student poster * /case STUDENTER: retur "vnd.android.cursor.dir /vnd.example.students"; /** * Få en bestemt student * /case STUDENT_ID: return "vnd.android.cursor.item /vnd.example.students"; standard: kaste nytt IllegalArgumentException ("Unsupported URI:" + uri); }}}

    Følgende vil den endrede innholdet i AndroidManifest.xml
    fil. Her har vi lagt til < leverandør ... /> tag å inkludere vår innholdsleverandør:?
    < xml version = "1.0" encoding = "utf-8" > < manifest xmlns:? android = "http://schemas.android.com/apk/res /android "pakken =" com.example.My Application "android: version =" 1 "android: versjon =" 1.0 "> < bruker-SDK android: minSdkVersion = "8" android: targetSdkVersion = "22" /> < søknad android: allowBackup = "true" android: icon = "@ teikne /ic_launcher" android: label = "@ streng /APP_NAME" android: tema = "@ stil /AppTheme" > < aktivitet android: name = "com.example.My Application.MainActivity" android: label = "@ streng /APP_NAME" > < intent-filter > < handling android: name = "android.intent.action.MAIN" /> < kategori android: name = "android.intent.category.LAUNCHER" /> < /intent-filter > < /aktivitets > < leverandør android: name = "StudentsProvider" < android: Myndighetene = "com.example.provider.College" > < /leverandør > < /søknad > < /manifest >

    Etter vil være innholdet i res /layout /activity_main.xml
    fil for å inkludere en knapp for å kringkaste den tilpassede hensikt −
    < RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android~~number=plural" xmlns: verktøy = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: layout_height = " match_parent "android: paddingLeft =" @ dimen /activity_horizontal_margin "android: paddingRight =" @ dimen /activity_horizontal_margin "android: paddingTop =" @ dimen /activity_vertical_margin "android: paddingBottom =" @ dimen /activity_vertical_margin "verktøy: kontekst =". MainActivity " /"> < TextView android: id =" + id /textView1 "android: layout_width =" wrap_content "android: layout_height =" wrap_content "android: text =" Content Provider "android: layout_alignParentTop =" true "android: layout_centerHorizontal = "true" android: Tekststørrelse = "30dp" /> < TextView android: id = "+ id /textView2" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "Tutorials point" android: textcolor = "# ff87ff09" android: Tekststørrelse = "30dp" android: layout_below = "+ id /textView1" android: layout_centerHorizontal = "true" /> < ImageButton android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "+ id /imageButton" android: src = "@ teikne /abc" android: layout_below = "+ id /textView2" android : layout_centerHorizontal = "true" /> < Button android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "+ id /knappen2" android: text = "Legg Name" android: layout_below = "+ id /editText3" android: layout_alignRight = "+ id /textView2" android: layout_alignEnd = "+ id /textView2" android: layout_alignLeft = "+ id /textView2" android: layout_alignStart = "+ id /textView2" android: onclick = "onClickAddName" /> < EditText android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "+ id /EditText" android: layout_below = "+ id /imageButton" android: layout_alignRight = "+ id /imageButton" android: layout_alignEnd = "+ id /imageButton" /> < EditText android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "+ id /editText2" android: layout_alignTop = "+ id /EditText" android: layout_alignLeft = "+ id /textView1" android: layout_alignStart = "+ id /textView1" android: layout_alignRight = "+ id /textView1" android: layout_alignEnd = "+ id /textView1" android: hint = "Navn" android: textColorHint = "@ android: farge /holo_blue_light "/> < EditText android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "+ id /editText3" android: layout_below = "+ id /EditText" android: layout_alignLeft = "+ id /editText2" android: layout_alignStart = "+ id /editText2" android: layout_alignRight = "+ id /editText2" android: layout_alignEnd = "+ id /editText2" android: hint = "Grade" android: textColorHint = "@ android: farge /holo_blue_bright "/> < Button android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "retrive student" android: id = "+ id /knapp" android: layout_below = "+ id /knappen2" android: layout_alignRight = "+ id /editText3" android: layout_alignEnd = "+ id /editText3" android: layout_alignLeft = "+ id /knappen2" android: layout_alignStart = "+ id /knappen2" Android: onclick = "onClickRetrieveStudents" /> < /RelativeLayout >

    Kontroller at du har følgende innhold av res /verdier /strings.xml
    file:?
    < xml version = "1.0" encoding = "utf-8" ? > < resources > < string name = "APP_NAME" > My Application < /string > < string name = "action_settings" > Innstillinger < /string > < /ressurser >;

    La oss prøve å kjøre vår modifiserte Min Application
    søknaden vi nettopp opprettet. Jeg antar at du hadde laget ditt AVD
    mens du gjør miljøet oppsett. For å kjøre programmet fra Android Studio IDE, åpne en av prosjektets aktivitets filer, og klikk Kjør ikonet fra verktøylinjen. Android Studio installerer programmet på AVD og starter den, og om alt er bra med set-up og anvendelse, vil det vise følgende Emulator vindu, være tålmodig fordi det kan ta en gang basert på datamaskinens hastighet:

    Nå la oss gå inn student Navn Hotell og Grade Anmeldelser og til slutt klikker på Legg Navn
    knappen, vil dette legge student post i databasen og vil blinke en melding nederst viser ContentProvider URI sammen med rekordmange lagt i databasen. Denne operasjonen gjør bruk av vår Sett ()
    metoden. La oss gjenta denne prosessen for å legge til noen flere elever i databasen vår innholdsleverandøren.

    Når du er ferdig med å legge poster i databasen, nå er det på tide å spørre ContentProvider å gi oss disse postene tilbake, så la oss klikke Hent Studenter
    knapp som vil hente og vise alle postene en etter en som er i henhold til vår gjennomføring av vår spørring ()
    metoden.

    Du kan skrive aktiviteter mot oppdatere og slette operasjoner ved å gi tilbakeringing funksjoner i MainActivity.java
    fil og deretter endre brukergrensesnittet til å ha knapper for oppdatering og slettet operasjoner på samme måte som vi har gjort for add og leseoperasjoner. Anmeldelser

    På denne måten kan du bruke eksisterende innholdsleverandør som adresseboken, eller du kan bruke Innholdsleverandør konsept i å utvikle fine databaseorienterte applikasjoner der du kan utføre alle slags databaseoperasjoner som lese, skrive, oppdatere og slette som forklart ovenfor i eksemplet .