Latest web development tutorials

Android fournisseur de contenu (Content Provider)

Fournisseur de contenu en demandant composant fournit des données d'une application à une autre application. Ces demandes par la voie de ContentResolver de classe à traiter. Les fournisseurs de contenu peuvent utiliser différents moyens de stocker des données. Les données peuvent être stockées dans une base de données, un fichier ou même un réseau.

image

Parfois, la nécessité de partager des données entre les applications. Dans ce cas, le fournisseur de contenu devient très utile.

Les fournisseurs de contenu peuvent faire l'attention du contenu, vous pouvez avoir un certain nombre de différentes applications d'accès, le cas échéant. Les fournisseurs de contenu et agit comme une base de données. Vous pouvez interroger, modifier son contenu, utilisez insert (), update (), supprimer () et d'interrogation () pour ajouter ou supprimer du contenu. Dans la plupart des cas, les données sont stockées dans une base de données SQLite.

Le fournisseur de contenu est mis en oeuvre en tant que sous-classe de la classe ContentProvider de classe. Nous avons besoin de mettre en œuvre une série d'API standard, d'autres applications pour exécuter la transaction.

public class MyApplication extends  ContentProvider {

}

contenu URI

Pour interroger le fournisseur de contenu, vous devez être sous la forme du format suivant pour spécifier la chaîne de requête URI:

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

Ce qui suit est une description spécifique de chaque partie de l'URI:

section explication
préfixe Prefix: a été défini comme contenu: //
autorité Autorisation: Indique le nom du fournisseur de contenu, tels que les contacts, navigateur, etc. les fournisseurs de contenu de tiers peut être un nom complet, tel que: cn.programmer.statusprovider
data_type Type de données: Ceci indique que ce type particulier de fournisseur de contenu des données. Par exemple: Vous souhaitez fournir par le fournisseur de contenu pour obtenir tous les contacts carnet d'adresses, le chemin de données est le peuple, alors l'URI se présente comme suit: content: // contacts / personnes
ça Cette demande a spécifié un enregistrement particulier. Par exemple: Vous fournissez les fournisseurs de contenu Contacts Trouver le numéro contact ID est 5, alors l'URI ressemble à ceci: contenu: // contacts / personnes / 5

Créer un fournisseur de contenu

Des étapes simples décrites ici fournisseurs de créer leur propre contenu.

  • D'abord, vous devez créer un ContentProviderbase classe de fournisseur de contenu de la classe dérivée.
  • Deuxièmement, vous devez définir votre contenu pour accéder à un fournisseur de contenu adresse URI.
  • Ensuite, vous devez créer une base de données au contenu du magasin. En règle générale, Android utilise la base de données SQLite et remplacer onCreate méthode () utilisée dans le cadre de la méthode SQLiteOpenHelper pour créer ou ouvrir un fournisseur de base de données. Lorsque votre application est lancée, sa méthode chaque fournisseur de contenu onCreate () sera appelée dans le thread principal de l'application.
  • Enfin, utilisez le <fournisseur ... /> tag enregistré en AndroidManifest.xml fournisseur de contenu.

Ce qui suit est le fournisseur de contenu pour obtenir votre travail, vous avez besoin d'une méthode dans la réécriture de ContentProvider de classe:

image

  • onCreate (): Appelé lorsque le fournisseur est démarré.
  • query (): Cette méthode accepte les demandes du client. Le résultat est l'objet retour pointeur (curseur).
  • insert (): les fournisseurs de contenu Cette méthode pour insérer un nouveau record.
  • delete (): Cette méthode est supprimée du fournisseur de contenu dans le dossier existant.
  • update (): Cette méthode met à jour le fournisseur de contenu dans le dossier existant.
  • getType (): Cette méthode retourne l'URI type de métadonnées donné.

Exemples

Cet exemple explique comment créer votre propre fournisseur de contenu. Suivons les étapes ci-dessous:

étape description
1 Créer des applications Android utilisant Android studio nommé fournisseur de contenu, dans le paquet cn.uprogrammer.contentprovider, et la mise en place des activités spatiales.
2 Modifier les principales activités MainActivity.java fichier pour ajouter deux nouvelles méthodes onClickAddName () et onClickRetrieveStudents ().
3 Créée sous le nouveau package Java cn.uprogrammer.contentprovider fichier StudentsProvider.java pour définir le fournisseur actuel, et les méthodes associées.
4 Utilisez <fournisseur ... /> dans AndroidManifest.xml enregistré fournisseur de contenu.
5 Modifier la résolution de contenu par défaut / mise en page / fichier activity_main.xml pour ajouter le dossier de l'élève contient une interface simple.
6 Sans modifier strings.xml, Android Studio payer fichier attention strings.xml.
7 Lancez l'émulateur Android pour exécuter l'application et de vérifier les résultats des modifications apportées à l'application.

Voici le contenu du fichier principal de l'activité src / cn.uprogrammer.contentprovider / MainActivity.java modifiée. Ce fichier contient chacun de l'approche de base du cycle de vie. Nous avons ajouté deux nouvelles méthodes, onClickAddName () et onClickRetrieveStudents () pour laisser l'interaction de l'utilisateur de la poignée de l'application.

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

Créez un nouveau fichier dans le package StudentsProvider.java cn.uprogrammer.contentprovider. Ce qui suit est le contenu 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);
        }
    }
}

Ce qui suit est le fichier AndroidManifest.xml modifications. Ici Ajouté <provider ... /> pour inclure nos fournisseurs de contenu:

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

Voici le contenu de res / layout / fichier 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>

Assurez-res / valeurs / fichier strings.xml a le contenu suivant:

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

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

</resources>

Disons simplement exécuter une application de fournisseur de contenu modifié. Je suppose que vous avez créé AVD au cours de l'environnement d'installation. Ouvrez votre projet dans le fichier actif, cliquez sur la barre d'outils image Icône pour exécuter l'application Dans Android Studio. Android studio installer l'application sur la DAV et démarre. Si tout va bien, il sera affiché sur la fenêtre de l'émulateur comme suit:

image

Entrez le nom et l'année, et cliquez sur le bouton "Ajouter", qui va ajouter un dossier d'étudiant dans les données, et au fond de supprimer un message. le contenu de l'information affiche un certain nombre d'enregistrements ajoutés au fournisseur de contenu de base de données URI. Cette opération utilise la méthode insert (). Répétez ce processus pour ajouter d'autres étudiants dans la base de données de notre fournisseur de contenu.

image

Une fois que vous avez terminé l'enregistrement de base de données est ajouté, il est temps de redonner au fournisseur de contenu nécessite ces enregistrements. Cliquez sur le bouton "Recherche", qui viendra récupérer et afficher toutes les données enregistrées par la mise en œuvre de la méthode query ().

Vous pouvez fournir méthode de rappel MainActivity.java pour préparer la mise à jour et supprimer des opérations, et de modifier l'interface utilisateur pour ajouter la mise à jour et supprimer des opérations.

Vous pouvez utiliser le contenu existant fourni de cette manière par ces contacts. Vous pouvez également de cette manière de développer une application bonne base de données orientée, vous pouvez être effectué comme décrit ci-dessus est connu comme une instance d'opérations de base de données, tels que lecture, écriture, mise à jour et supprimer.