Latest web development tutorials

Proveedor de Contenido Android (Content Provider)

proveedor de contenido mediante la solicitud de componente proporciona datos de una aplicación a otra aplicación. Estas solicitudes de la manera ContentResolver clase de tratar. Los proveedores de contenido pueden utilizar diferentes formas de almacenar datos. Los datos pueden ser almacenados en una base de datos, archivo, o incluso una red.

imagen

A veces, la necesidad de compartir datos entre aplicaciones. En este caso, el proveedor de contenido se convierte en muy útil.

Los proveedores de contenido pueden hacer que el foco de contenido, puede tener un número de diferentes aplicaciones de acceso, si es necesario. Los proveedores de contenido y actúa como una base de datos. Se puede consultar, editar su contenido, use el inserto (), update (), eliminar () y consulta () para agregar o eliminar el contenido. En la mayoría de los casos los datos se almacenan en una base de datos SQLite.

El proveedor de contenidos se implementa como una subclase de la clase ContentProvider clase. Debemos poner en práctica una serie de API estándar, por lo que otras aplicaciones para ejecutar la transacción.

public class MyApplication extends  ContentProvider {

}

contenido URI

Para consultar el proveedor de contenidos, tiene que estar en la forma de la siguiente formato para especificar la cadena de consulta URI:

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

La siguiente es una descripción específica de cada parte de la URI:

sección explicación
prefijo Prefijo: se ha establecido como contenido: //
autoridad Autorización: Especifica el nombre del proveedor de contenido, como contactos, navegador, etc. proveedores de contenidos de terceros pueden ser un nombre completo, tales como: cn.programmer.statusprovider
data_type Tipo de datos: Esto indica que este tipo particular de proveedor de contenido de los datos. Por ejemplo: Usted desea proporcionar por el proveedor de contenido para obtener toda la libreta de direcciones de contactos, la ruta de datos es la gente, entonces el URI se verá de la siguiente manera: Contenido: // contactos / personas
identificación Esta solicitud especifica un registro en particular. Por ejemplo: Usted proporciona el proveedor de contenidos Contacta Encuentra número de contacto de identificación es 5, entonces el URI tiene el siguiente aspecto: contenido: // contactos / personas / 5

Crear proveedor de contenido

sencillos pasos que se describen aquí los proveedores crear sus propios contenidos.

  • En primer lugar, es necesario crear una clase ContentProviderbase proveedor de contenido de clase derivada.
  • En segundo lugar, es necesario definir su contenido para acceder a proveedor de contenido de la dirección URI.
  • A continuación, es necesario crear una base de datos para almacenar contenido. Por lo general, Android utiliza la base de datos SQLite y anular onCreate () método utilizado en el marco del método SQLiteOpenHelper para crear o abrir un proveedor de base de datos. Cuando se inicia la aplicación, su método cada proveedor de contenido onCreate () será llamado en el hilo principal de la aplicación.
  • Por último, utilice la etiqueta <proveedor de ... /> registrada en el proveedor de contenidos AndroidManifest.xml.

El siguiente es el proveedor de contenidos para realizar su trabajo, se necesita algún método en la clase reescrita ContentProvider:

imagen

  • onCreate (): Se llama cuando se inicia el proveedor.
  • query (): Este método acepta solicitudes del cliente. El resultado es el objeto de puntero de retorno (Cursor).
  • insertar (): proveedores de contenido Este método para insertar un nuevo registro.
  • delete (): Este método se elimina del proveedor de contenido en el registro existente.
  • update (): Este método actualiza el proveedor de contenidos en el registro existente.
  • getType (): Este método devuelve el tipo de metadatos URI dado.

Ejemplos

En este ejemplo se explica cómo crear su propio proveedor de contenido. Vamos a seguir los siguientes pasos:

paso descripción
1 Crear aplicaciones Android con Android Estudio Proveedor de Contenido llamada, en la cn.uprogrammer.contentprovider paquete, y el establecimiento de las actividades espaciales.
2 Modificar las principales actividades MainActivity.java archivo para añadir dos nuevos métodos onClickAddName (onClickRetrieveStudents) y ().
3 Creado bajo el nuevo paquete de Java cn.uprogrammer.contentprovider archivo StudentsProvider.java para definir el proveedor real, y métodos asociados.
4 Uso <proveedor de ... /> en AndroidManifest.xml registrado proveedor de contenido.
5 Modificar el archivo de contenido predeterminado res / layout / activity_main.xml para añadir el expediente del estudiante contiene una interfaz sencilla.
6 Sin modificar strings.xml, Android Estudio pagará archivo strings.xml atención.
7 Lanzar emulador de Android para ejecutar la aplicación y verificar los resultados de los cambios realizados en la aplicación.

Este es el contenido del archivo principal de la actividad src / cn.uprogrammer.contentprovider / MainActivity.java modificada. Este archivo contiene cada uno de el enfoque básico del ciclo de vida. Hemos añadido dos nuevos métodos, onClickAddName (onClickRetrieveStudents) y () para permitir que la interacción con el usuario de contexto de aplicación.

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

Crear un nuevo archivo en el paquete StudentsProvider.java cn.uprogrammer.contentprovider. El siguiente es el contenido de src / cn.uprogrammer.contentprovider / StudentsProvider.java de.

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

La siguiente es la modificación de archivos AndroidManifest.xml. Aquí Añadido <proveedor de ... /> para incluir nuestros proveedores de contenido:

<?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>

Este es el contenido de la resolución de archivo / diseño / activity_main.xml:

<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>

Garantizar res / valores de archivo / strings.xml tiene el siguiente contenido:

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

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

</resources>

Vamos a ejecutar una aplicación de proveedor de contenido modificado. Asumo que ha creado AVD en el entorno de instalación. Abra el proyecto en el archivo activo, haga clic en la barra de herramientas imagen Icono para ejecutar la aplicación en Android Studio. Android Estudio instalar la aplicación en la AVD y la inicia. Si todo va bien, se mostrará en la ventana de emulación de la siguiente manera:

imagen

Introduzca el nombre y el año y haga clic en el botón "Añadir", que agregará un registro de los estudiantes en los datos, y en la parte inferior para eliminar un mensaje. Contenido de la información muestra un número de registros añadidos a la base de datos del proveedor de contenido de URI. Esta operación utiliza el método de inserción (). Repita este proceso para agregar más estudiantes en la base de datos de nuestro proveedor de contenido.

imagen

Una vez que complete el registro se añade la base de datos, es el momento de devolver al proveedor de contenidos, establecen que dichos registros. Haga clic en el botón "Buscar", que lo será para recuperar y mostrar todos los datos registrados por la aplicación del método de consulta ().

Puede proporcionar un método de devolución de llamada MainActivity.java para preparar la actualización y supresión, y modificar la interfaz de usuario para agregar actualizar y eliminar operaciones.

Puede utilizar el contenido existente en esta forma por tales contactos. También puede hacer de esta manera el desarrollo de una buena aplicación de base de datos orientada-, se puede llevar a cabo como se ha descrito anteriormente se conoce como una instancia de operaciones de bases de datos, tales como leer, escribir, actualizar y borrar.