Latest web development tutorials

Android-Content-Provider (Content Provider)

Content-Provider durch die Komponente anfordert liefert Daten von einer Anwendung zu einer anderen Anwendung. Diese Anfragen von der Klasse ContentResolver Weise zu behandeln. Content Provider können verschiedene Möglichkeiten zum Speichern von Daten verwenden. Daten können in einer Datenbank, eine Datei oder sogar einem Netzwerk gespeichert werden.

Bild

Manchmal ist die Notwendigkeit, Daten zwischen Anwendungen teilen. In diesem Fall wird der Inhaltsanbieter sehr nützlich.

Content-Provider können Inhalte Fokus zu machen, können Sie eine Reihe von verschiedenen Anwendungen zugreifen können, falls erforderlich. Content-Provider und wirkt wie eine Datenbank. Sie können ihren Inhalt abzufragen, zu bearbeiten, verwenden insert (), update (), delete () und Abfrage (), um Inhalt hinzuzufügen oder zu löschen. In den meisten Fällen werden die Daten in einer SQLite-Datenbank gespeichert.

Der Inhaltsanbieter ist als Unterklasse der Klasse Contentprovider-Klasse implementiert. Wir brauchen eine Reihe von Standard-API zu implementieren, so dass andere Anwendungen, die Transaktion auszuführen.

public class MyApplication extends  ContentProvider {

}

Inhalt URI

Um den Content-Provider abfragen, müssen Sie in der Form des folgenden Format, um die URI-Query-String angeben:

<prefix>://<authority>/<data_type>/<id>

Nachfolgend finden Sie eine genaue Beschreibung der einzelnen Teile des URI:

Abschnitt Erklärung
Präfix Präfix: hat als Inhalt gesetzt: //
Behörde Berechtigung: Gibt den Namen des Inhalteanbieters, wie Kontakte, Browser etc. Dritter Content-Provider kann ein vollständiger Name sein, wie zum Beispiel: cn.programmer.statusprovider
data_type Datentyp: Dies zeigt an, dass diese besondere Art von Content-Provider der Daten. Zum Beispiel: Sie durch den Content-Provider zur Verfügung stellen möchten alle Kontakte Adressbuch zu bekommen, ist der Datenpfad die Menschen, dann wird der URI wie folgt aussehen: Inhalt: // Kontakte / Personen
Identifikation Diese Anforderung spezifiziert einen bestimmten Datensatz. Zum Beispiel: Sie stellen die Inhaltsanbieter Kontakte Kontakt ID-Nummer finden 5 ist, dann sucht der URI wie folgt aus: Inhalt: // Kontakte / people / 5

Erstellen Sie Inhaltsanbieter

Einfache Schritte hier Anbieter beschrieben, eigene Inhalte zu erstellen.

  • Zunächst müssen Sie eine abgeleitete Klasse ContentProviderbase Content-Provider-Klasse zu erstellen.
  • Zweitens müssen Sie Ihre Inhalte für den Zugriff auf Content-Provider-URI-Adresse zu definieren.
  • Als nächstes müssen Sie eine Datenbank zum Speichern von Inhalten zu erstellen. Typischerweise verwendet Android SQLite-Datenbank und überschreiben onCreate () Methode im Rahmen der SQLiteOpenHelper Methode verwendet, um eine Datenbank erstellen oder Anbieter öffnen. Wenn die Anwendung gestartet wird, dessen jeder Content-Provider onCreate () -Methode wird im Antrag des Haupt-Thread aufgerufen werden.
  • Schließlich verwenden die <Provider ... /> Tag registriert in AndroidManifest.xml Content-Provider.

Im Folgenden ist der Content-Provider, Ihre Arbeit zu bekommen, müssen Sie eine Methode in der Klasse Contentprovider neu geschrieben:

Bild

  • onCreate (): Wird aufgerufen, wenn der Anbieter gestartet wird.
  • query (): Diese Methode nimmt Anfragen vom Client aus. Das Ergebnis ist der Rückgabezeiger (Cursor) Objekt.
  • einfügen (): Diese Methode Content-Provider einen neuen Datensatz einzufügen.
  • löschen (): Diese Methode wird aus dem Content-Provider in den bestehenden Datensatz gelöscht.
  • update (): Diese Methode aktualisiert den Content-Provider in den bestehenden Rekord.
  • getType (): Diese Methode gibt den angegebenen URI Metadatentyp.

Beispiele

In diesem Beispiel wird erläutert, wie Sie Ihren eigenen Content-Provider zu erstellen. Lassen Sie uns die folgenden Schritte aus:

Schritt Beschreibung
1 Erstellen Sie Android-Anwendungen Android Studio namens Content-Provider verwenden, in dem Paket cn.uprogrammer.contentprovider, und die Einrichtung von Weltraumaktivitäten.
2 Ändern Sie die wichtigsten Aktivitäten MainActivity.java zwei neue Methoden Datei onClickAddName hinzufügen () und onClickRetrieveStudents ().
3 Erstellt unter dem neuen Java-Paket cn.uprogrammer.contentprovider StudentsProvider.java Datei, um den tatsächlichen Anbieter zu definieren, und die damit verbundenen Methoden.
4 Mit <Provider ... /> Tag in AndroidManifest.xml registrierten Content-Provider.
5 Ändern Sie den Standard-Content-res / Layout / activity_main.xml Datei der Student-Datensatz enthält eine einfache Schnittstelle hinzuzufügen.
6 Ohne Modifikation strings.xml wird Android Studio Aufmerksamkeit strings.xml Datei zahlen.
7 Starten Sie Android-Emulator die Anwendung und überprüfen Sie die Ergebnisse von Änderungen an der Anwendung auszuführen.

Hier ist der Inhalt der geänderten Hauptaktivität Datei src / cn.uprogrammer.contentprovider / MainActivity.java von. Diese Datei enthält jede der Grundlebenszyklus-Ansatz. Wir haben zwei neue Methoden hinzugefügt, onClickAddName () und onClickRetrieveStudents (), um die Anwendung Griff Interaktion mit dem Benutzer zu lassen.

package cn.uprogrammer.contentprovider;

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;
import cn.uprogrammer.contentprovider.R;

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.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());
        }
    }
}

Erstellen Sie eine neue Datei im Paket StudentsProvider.java cn.uprogrammer.contentprovider. Im Folgenden ist der Inhalt von src / cn.uprogrammer.contentprovider / StudentsProvider.java von.

package cn.uprogrammer.contentprovider;

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);
    }

    /**
     * 数据库特定常量声明
     */
    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);";

    /**
     * 创建和管理提供者内部数据源的帮助类.
     */
    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);

        /**
         * 如果不存在,则创建一个可写的数据库。
         */
        db = dbHelper.getWritableDatabase();
        return (db == null)? false:true;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        /**
         * 添加新学生记录
         */
        long rowID = db.insert( STUDENTS_TABLE_NAME, "", values);

        /**
         * 如果记录添加成功
         */

        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 == ""){
            /**
             * 默认按照学生姓名排序
             */
            sortOrder = NAME;
        }
        Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder);

        /**
         * 注册内容URI变化的监听器
         */
        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)){
            /**
             * 获取所有学生记录
             */
            case STUDENTS:
                return "vnd.android.cursor.dir/vnd.example.students";

            /**
             * 获取一个特定的学生
             */
            case STUDENT_ID:
                return "vnd.android.cursor.item/vnd.example.students";

            default:
                throw new IllegalArgumentException("Unsupported URI: " + uri);
        }
    }
}

Hier finden Sie die AndroidManifest.xml Dateiänderungen. Hier Hinzugefügt <provider ... /> Tag unsere Content-Provider sind:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.uprogrammer.contentprovider"
    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="cn.uprogrammer.contentprovider.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>

Hier ist der Inhalt der res / Layout / activity_main.xml Datei:

<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="内容提供者实例"
        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="www.uprogrammer.cn"
        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/ic_launcher"
        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="添加"
        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="姓名"
        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="年级"
        android:textColorHint="@android:color/holo_blue_bright" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询"
        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>

Stellen Sie sicher, res / Werte / strings.xml Datei den folgenden Inhalt hat:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Content Provider</string>
    <string name="action_settings">Settings</string>

</resources>

Lassen Sie uns einfach eine modifizierte Content-Provider-Anwendung ausführen. Ich nehme an, Sie AVD während der Installationsumgebung erstellt haben. Öffnen Sie das Projekt in der aktiven Datei, klicken Sie in der Symbolleiste auf Bild Icon ausführen, um die Anwendung im Android Studio. Android Studio installieren Sie die Anwendung auf dem AVD und gestartet. Wenn alles gut geht, wird es auf dem Emulator-Fenster angezeigt werden, wie folgt:

Bild

Geben Sie den Namen und das Jahr, und klicken Sie auf die Schaltfläche "Hinzufügen", die ein Student Datensatz in den Daten hinzufügen, und an der Unterseite eine Nachricht zu löschen. Informationsgehalt zeigt eine Anzahl von Datensätzen in der Datenbank Content-Provider hinzugefügt URI. Dieser Vorgang verwendet den Einsatz () -Methode. Wiederholen Sie diesen Vorgang mehr Studenten in unserem Content-Provider-Datenbank hinzuzufügen.

Bild

Sobald Sie die Datenbank-Eintrag hinzugefügt wird abgeschlossen ist, ist es Zeit, den Content-Provider diese Datensätze erfordert, zurück zu geben. Klicken Sie auf die Schaltfläche "Suchen", die durch die Umsetzung der query () Methode erfasst alle Daten kommen abrufen und anzeigen.

Sie können MainActivity.java Callback-Methode Update vorzubereiten und schreib zu löschen, und die Benutzeroberfläche ändern Update hinzufügen und Operationen löschen.

Sie können auf diese Weise durch einen solchen Kontakten bestehenden Inhalte zu verwenden. Sie können auf diese Weise auch eine gute Datenbank orientierte Anwendung zu entwickeln, können Sie wie oben als eine Instanz von Datenbankoperationen wie Lesen, Schreiben, Aktualisieren und Löschen von bekannten beschrieben durchgeführt werden.