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 () 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: < b> onCreate () spørring () Sett () slett () oppdateringen () getType () Dette eksempelet vil forklare deg hvordan du kan lage din egen ContentProvider Følgende er innholdet i den modifiserte hovedaktivitet filen src /com.example.My Søknad /MainActivity.java Opprett ny fil StudentsProvider.java under com.example.My Application Følgende vil den endrede innholdet i AndroidManifest.xml Etter vil være innholdet i res /layout /activity_main.xml Kontroller at du har følgende innhold av res /verdier /strings.xml La oss prøve å kjøre vår modifiserte Min Application Nå la oss gå inn student Navn Hotell og Grade Anmeldelser og til slutt klikker på Legg Navn 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 Du kan skrive aktiviteter mot oppdatere og slette operasjoner ved å gi tilbakeringing funksjoner i MainActivity.java 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 .
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.
ContentProvider
Denne metoden kalles når tilbyder er startet.
Denne metoden mottar en forespørsel fra en klient. Resultatet returneres som en markør objekt.
Denne metoden setter ny rekord i innholdsleverandøren.
Denne metoden sletter en eksisterende rekord fra innholdsleverandøren.
Denne metoden oppdaterer en eksisterende rekord fra innholdsleverandøren.
Denne metoden returnerer med MIME-typen data på den gitte URI.
< h2> Eksempel
. 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.
. 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 ()); }}}
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); }}}
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 >
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 >
file:?
< xml version = "1.0" encoding = "utf-8" ? > < resources > < string name = "APP_NAME" > My Application < /string > < string name = "action_settings" > Innstillinger < /string > < /ressurser >;
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:
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.
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.
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