Ein Content-Provider-Komponente liefert Daten von einer Anwendung zur anderen auf Anfrage. Solche Anfragen werden von den Methoden der ContentResolver Klasse behandelt. Ein Content-Provider kann verschiedene Möglichkeiten zur Speicherung der Daten zu verwenden, und die Daten können in einer Datenbank in Dateien oder sogar über ein Netzwerk gespeichert werden.
INHALT ANBIETER
Manchmal ist es erforderlich, Daten zwischen Anwendungen zu teilen. Dies ist, wo Content-Anbieter zu werden sehr nützlich.
Content-Anbieter können Sie Inhalte an einem Ort zu zentralisieren und haben viele verschiedene Anwendungen zugreifen können, wie gebraucht. Ein Content-Provider verhält sich sehr ähnlich wie eine Datenbank, wo Sie es abzufragen, seinen Inhalt zu bearbeiten, sowie hinzuzufügen oder mit insert (), update () Löschen von Inhalten, delete () und query () Methoden. In den meisten Fällen werden diese Daten in einer gespeicherten SQlite Datenbank.
Ein Content-Provider wird als Unterklasse implementiert Contentprovider-Klasse und muss einen Standardsatz von APIs, die anderen Anwendungen zu ermöglichen, Transaktionen durchführen zu implementieren.
public class My Application extends ContentProvider { }
Inhalt URIs
Um einen Inhaltsanbieter abzufragen, geben Sie den Abfrage-String in Form einer URI, das folgende Format hat:
<prefix>://<authority>/<data_type>/<id>
Hier ist das Detail der verschiedenen Teile des URI -
Part | Bezeichnung |
---|---|
Präfix | Dieser wird immer auf Inhalte setzen: // |
Autorität | Dies gibt den Namen des Inhaltsanbieters, beispielsweise Kontakte,Browser usw. Für Drittanbieter-Content-Anbieter, könnte dies der vollständig qualifizierte Name sein, wie zum Beispielcom.tutorialspoint.statusprovider |
Dateityp | Dies zeigt an, welche Art von Daten, die diese besondere Provider bietet. Zum Beispiel, wenn Sie auch alle Kontakte aus den KontaktContent-Provider, dann ist der Datenpfad wäre, Menschen und URI würde wie folgt aussehen Inhalt: // Kontakte / Personen |
Ich würde | Dies gibt den angeforderten bestimmten Datensatz. Zum Beispiel, wenn Sie sich für Kontaktnummer 5 in den Kontakten suchen Content-Provider dann URI würde wie folgt aussehen Inhalt: // Kontakte / Personen / 5. |
Erstellen Sie Content Provider
Dies beinhaltet einige einfache Schritte, um Ihre eigenen Content-Provider zu erstellen.
- Zunächst müssen Sie eine Content-Provider-Klasse, die sich zu erstellenContentProviderbaseclass.
- Zweitens müssen Sie Ihre Content-Provider-URI-Adresse, die verwendet wird, um auf den Inhalt zugreifen wird, zu definieren.
- Weiter benötigen Sie, um Ihre eigene Datenbank, um den Inhalt zu halten erstellen. Normalerweise nutzt Android SQLite-Datenbank und Rahmen muss schreiben onCreate () Methode, die SQLite Öffnen Helper-Methode zum Erstellen oder öffnen des Anbieters Datenbank.Wenn Sie Ihre Anwendung gestartet wird, die onCreate () wird Handler jedes seiner Content-Provider auf der Hauptanwendungsthread aufgerufen.
- Weiter müssen Sie Content Provider-Abfragen zu implementieren, um verschiedene Datenbank bestimmte Operationen durchzuführen.
- Schließlich registrieren Sie Ihr Content-Provider in Ihrer Tätigkeit Datei mit <provider> Tag.
Hier ist die Liste von Methoden, die Sie in der Content-Provider-Klasse überschreiben, um Ihren Content Provider Arbeits haben müssen:
INHALT ANBIETER
- onCreate () Diese Methode wird aufgerufen, wenn der Anbieter gestartet.
- query () Diese Methode erhält eine Anfrage von einem Client. Das Ergebnis wird als ein Cursor-Objekt zurückgegeben.
- insert () Diese Methode fügt einen neuen Datensatz in die Content-Provider.
- delete () Diese Methode löscht einen bestehenden Datensatz aus der Content-Provider.
- update () Diese Methode aktualisiert einen vorhandenen Datensatz aus der Content-Provider.
- getType () Diese Methode gibt den MIME-Typ der Daten an der angegebenen URI.
Beispiel
Dieses Beispiel wird Ihnen erklären, wie Sie Ihre eigenen erstellenContentprovider. Lassen Sie uns also befolgen Sie die folgenden Schritte, um ähnlich, was wir während der Erstellung gefolgt Hallo Welt Beispiel -
Schritt | Bezeichnung |
---|---|
1 | Sie werden Android StudioIDE verwenden, um ein Android-Anwendung erstellen und benennen es als meine Anwendung unter einem Paketcom.example.My Anwendung, mit leeren Aktivität. |
2 | Ändern Haupttätigkeit Datei MainActivity.java zwei neue Methoden hinzufügen onClickAddName () und onClickRetrieveStudents (). |
3 | Erstellen Sie eine neue Datei namens java StudentsProvider.java unter dem Paket com.example.My Anwendung zu Ihrer eigentlichen Provider und die damit verbundenen Verfahren zu definieren. |
4 | Registrieren Sie Ihr Content-Provider in Ihrer AndroidManifest.xml Datei mit <provider ... /> Tag |
5 | Ändern Sie den Standardinhalt der res / layout / activity_main.xml-Datei, um eine kleine GUI für Studenten Datensätze hinzuzufügen sind. |
6 | Keine Notwendigkeit, string.xml.Android Studio ändern kümmern sich string.xml Datei. |
7 | Führen Sie die Anwendung auf Android-Emulator zu starten, und überprüfen Sie das Ergebnis der Änderungen in der Anwendung durchgeführt. |
Im Anschluss ist der Gehalt des modifizierten Haupttätigkeit Datei src / com.example.My Anwendung / MainActivity.java. Diese Datei kann jedes der grundlegenden Lebenszyklus Methoden umfassen. Wir haben zwei neue Methoden onClickAddName () und onClickRetrieveStudents (), um Benutzerinteraktion mit der Anwendung zu behandeln.
package 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 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickAddName(View view) { // Add a new student record ContentValues values = new 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().insert( StudentsProvider.CONTENT_URI, values); Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show(); } public void onClickRetrieveStudents(View view) { // Retrieve student records String URL = "content://com.example.provider.College/students"; Uri students = Uri.parse(URL); Cursor c = managedQuery(students, null, null, null, "name"); if (c.moveToFirst()) { do{ Toast.makeText(this, c.getString(c.getColumnIndex(StudentsProvider._ID)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)), Toast.LENGTH_SHORT).show(); } while (c.moveToNext()); } } }
Neue Datei erstellen StudentsProvider.java unter com.example.MyAnwendungspaket und folgenden ist der Inhalt des src / com.example.My Anwendung / StudentsProvider.java -
package 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 extends ContentProvider { static final String PROVIDER_NAME = "com.example.provider.College"; static final String URL = "content://" + PROVIDER_NAME + "/students"; static final Uri CONTENT_URI = Uri.parse(URL); static final String _ID = "_id"; static final String NAME = "name"; static final String GRADE = "grade"; private static HashMap<String, String> STUDENTS_PROJECTION_MAP; static final int STUDENTS = 1; static final int STUDENT_ID = 2; static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS); uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID); } /** * Database specific constant declarations */ private SQLiteDatabase db; static final String DATABASE_NAME = "College"; static final String STUDENTS_TABLE_NAME = "students"; static final int DATABASE_VERSION = 1; static final String CREATE_DB_TABLE = " CREATE TABLE " + STUDENTS_TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL, " + " grade TEXT NOT NULL);"; /** * Helper class that actually creates and manages * the provider's underlying data repository. */ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context){ super(context, 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 EXISTS " + STUDENTS_TABLE_NAME); onCreate(db); } } @Override public boolean onCreate() { Context context = getContext(); DatabaseHelper dbHelper = new DatabaseHelper(context); /** * Create a write able database which will trigger its * creation if it doesn't already exist. */ db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Uri insert(Uri uri, ContentValues values) { /** * Add a new student record */ long rowID = db.insert( STUDENTS_TABLE_NAME, "", values); /** * If record is added successfully */ if (rowID > 0) { Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to add a record into " + uri); } @Override public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(STUDENTS_TABLE_NAME); switch (uriMatcher.match(uri)) { case STUDENTS: qb.setProjectionMap(STUDENTS_PROJECTION_MAP); break; case STUDENT_ID: qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } if (sortOrder == null || sortOrder == ""){ /** * By default sort on student names */ sortOrder = NAME; } Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder); /** * register to watch a content URI for changes */ c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs); break; case STUDENT_ID: String id = uri.getPathSegments().get(1); count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.update(STUDENTS_TABLE_NAME, values, selection, selectionArgs); break; case STUDENT_ID: count = db.update(STUDENTS_TABLE_NAME, values, _ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" +selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri ); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)){ /** * Get all student records */ case STUDENTS: return "vnd.android.cursor.dir/vnd.example.students"; /** * Get a particular student */ case STUDENT_ID: return "vnd.android.cursor.item/vnd.example.students"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } }
Im Anschluss wird der modifizierte Inhalt der AndroidManifest.xml Datei. Hier haben wir hinzugefügt <provider ... /> Tag, um unsere Inhalte-Anbieter sind:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.My Application.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="StudentsProvider" <android:authorities="com.example.provider.College"> </provider> </application> </manifest>
Im Anschluss wird der Inhalt sein res / layout / activity_main.xml Datei eine Schaltfläche, um gehören zu Ihrer benutzerdefinierten Absicht ausgestrahlt -
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="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" tools:context=".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:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="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="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Add 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="Name" android:textColorHint="@android:color/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:color/holo_blue_bright" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Retrive student" android:id="@+id/button" android:layout_below="@+id/button2" android:layout_alignRight="@+id/editText3" android:layout_alignEnd="@+id/editText3" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:onClick="onClickRetrieveStudents"/> </RelativeLayout>
Achten Sie darauf, folgende Inhalt von res / Werte / strings.xml Datei:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string> </resources>;
Lassen Sie uns versuchen, unsere modifizierten laufen My ApplicationAnwendung, die wir gerade erstellt haben. Ich nehme an, Sie geschaffen hatteAVD dabei Umfeld Set-up. Um die App vom Android Studio IDE, öffnen Sie eine Aktivität Dateien Ihres Projekt auszuführen, und klicken Sie auf
Ausführen-Symbol in der Werkzeugleiste. Android Studio installiert die App auf Ihrem AVD und startet es und wenn alles in Ordnung ist mit der Einrichtung und Anwendung, wird es angezeigt folgenden Emulator-Fenster, werden die Geduld, weil es irgendwann auf Ihrem Computer Geschwindigkeit auf der Grundlage nehmen:
Lassen Sie uns jetzt geben Studentennamen und Grade und schließlich klicken Sie auf Add-Name-Taste, wird dies Student Datensatz in der Datenbank hinzuzufügen, wird eine Meldung am unteren Rand zeigt Content URI zusammen mit Rekordzahl in der Datenbank hinzugefügt blinken. Dieser Vorgang nutzt unsere insert () Methode. Lassen Sie uns wiederholen Sie diesen Vorgang, um einige Schüler in der Datenbank unserer Content-Provider hinzufügen.
Sobald Sie mit Hinzufügen von Datensätzen in der Datenbank, jetzt ist es Zeit getan, um Content fragen Sie uns die Datensätze zurück zu geben, damit wir Sie auf Retrieve Studenten-Taste, die abgerufen und angezeigt alle Datensätze eines nach dem anderen, die nach unserer der Umsetzung ist unser query ()Methode.
Sie können Aktivitäten gegen aktualisieren und Löschoperationen durch Callback-Funktionen in MainActivity.java-Datei und ändern Sie dann Benutzeroberfläche Buttons zu aktualisieren und gelöschte Operationen in der gleichen Weise, wie wir für Add getan und Leseoperationen.
Auf diese Weise können bestehende Content Provider wie Adressbuch verwenden, oder Sie können Content-Provider-Konzept bei der Entwicklung schönen Datenbank orientierte Anwendungen, wo Sie alle Arten von Datenbankoperationen wie Lese- verwenden können, zu schreiben, aktualisieren und löschen, wie oben im Beispiel erläutert.
0 التعليقات:
Kommentar veröffentlichen