Android - Content Provider

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 -
PartBezeichnung
PräfixDieser wird immer auf Inhalte setzen: //
AutoritätDies 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
DateitypDies 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ürdeDies 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

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 -
SchrittBezeichnung
1Sie 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 ().
3Erstellen 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.
4Registrieren 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.
6Keine Notwendigkeit, string.xml.Android Studio ändern kümmern sich string.xml Datei.
7Fü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 
Android StudioRun Icon
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:

Android Content Provider Demo
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.
Datensätze mit Contentprovider 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.
Share on Google Plus

About ptjqatar

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.

0 التعليقات:

Kommentar veröffentlichen