Latest web development tutorials

Content Provider Android (Content Provider)

provedor de conteúdo, solicitando componente fornece dados de uma aplicação para outra aplicação. Estes pedidos pelo caminho classe ContentResolver de lidar. Os provedores de conteúdo podem utilizar formas diferentes para armazenar dados. Os dados podem ser armazenados numa base de dados, ficheiros, ou mesmo uma rede.

fotografia

Às vezes, a necessidade de compartilhar dados entre aplicações. Neste caso, o fornecedor de conteúdo torna-se muito útil.

Os provedores de conteúdo podem fazer foco do conteúdo, você pode ter um número de diferentes aplicações de acesso, se necessário. Os provedores de conteúdo e funciona como um banco de dados. Você pode consultar, editar seu conteúdo, use insert (), update (), delete () e consulta () para adicionar ou excluir conteúdo. Na maioria dos casos, os dados são armazenados numa base de dados SQLite.

O provedor de conteúdo é implementado como uma subclasse da classe classe ContentProvider. É necessário implementar uma série de API padrão, para que outros aplicativos para executar a transação.

public class MyApplication extends  ContentProvider {

}

conteúdo URI

Para consultar o provedor de conteúdo, você precisa ser na forma de o seguinte formato para especificar a cadeia de consulta URI:

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

O que se segue é uma descrição específica de cada parte da URI:

seção explicação
prefixo Prefixo: foi definido como conteúdo: //
autoridade Autorização: Especifica o nome do provedor de conteúdo, como contatos, navegador, etc. provedores de conteúdo de terceiros pode ser um nome completo, tais como: cn.programmer.statusprovider
data_type Tipo de dados: Isso indica que esse tipo específico de provedor de conteúdo dos dados. Por exemplo: Você quer fornecer pelo provedor de conteúdo para obter todo o catálogo de endereços de contatos, o caminho de dados é o povo, então o URI ficará da seguinte forma: conteúdo: // contatos / pessoas
identidade Este pedido especificado um determinado registro. Por exemplo: Você fornece o provedor de conteúdo Contacto Encontre o número de contacto ID é 5, então o URI se parece com isso: conteúdo: // contatos / pessoas / 5

Criar provedor de conteúdo

passos simples descritos aqui fornecedores para criar seu próprio conteúdo.

  • Primeiro, você precisa criar uma classe derivada ContentProviderbase classe de provedor de conteúdo.
  • Em segundo lugar, você precisa definir o seu conteúdo para acessar provedor de conteúdo de endereço URI.
  • Em seguida, você precisa criar um banco de dados para armazenar conteúdo. Normalmente, Android usa banco de dados SQLite e substituir onCreate () método utilizado no quadro do método SQLiteOpenHelper para criar ou abrir um provedor de banco de dados. Quando o aplicativo é iniciado, o seu método de cada provedor de conteúdo onCreate () será chamado no thread principal do aplicativo.
  • Finalmente, use a tag <provedor ... /> registrado em AndroidManifest.xml provedor de conteúdo.

O seguinte é o provedor de conteúdo para obter o seu trabalho, você precisa de algum método na reescrita classe ContentProvider:

fotografia

  • onCreate (): Chamado quando o provedor é iniciado.
  • query (): Este método aceita solicitações do cliente. O resultado é o objeto ponteiro de retorno (Cursor).
  • insert (): Os prestadores este conteúdo método para inserir um novo registro.
  • delete (): Este método é excluído do provedor de conteúdo no registro existente.
  • update (): Este método atualiza o provedor de conteúdo no registro existente.
  • getType (): Este método retorna a determinado tipo de metadados URI.

Exemplos

Este exemplo explica como criar seu próprio provedor de conteúdo. Vamos seguir os passos abaixo:

passo descrição
1 Criar aplicativos do Android que usam Android Estúdio nomeado Provedor de Conteúdo, na cn.uprogrammer.contentprovider pacote, e o estabelecimento de atividades espaciais.
2 Modificar as principais atividades MainActivity.java arquivo para adicionar dois novos métodos onClickAddName () e onClickRetrieveStudents ().
3 Criado no âmbito do novo pacote Java cn.uprogrammer.contentprovider arquivo StudentsProvider.java para definir o provedor atual e métodos associados.
4 Use <provedor ... /> tag em AndroidManifest.xml registrado provedor de conteúdo.
5 Modificar o arquivo / activity_main.xml res de conteúdo padrão layout / para adicionar o registro do aluno contém uma interface simples.
6 Sem modificar strings.xml, Estúdio Android pagará arquivo strings.xml atenção.
7 Lançar emulador Android para executar o aplicativo e verificar os resultados das alterações feitas no aplicativo.

Aqui está o conteúdo do arquivo principal atividade src / cn.uprogrammer.contentprovider / MainActivity.java modificada. Este ficheiro contém cada um a abordagem básica de ciclo de vida. Nós adicionamos dois novos métodos, onClickAddName () e onClickRetrieveStudents () para permitir que a interação com o usuário pega aplicação.

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

Crie um novo arquivo no pacote StudentsProvider.java cn.uprogrammer.contentprovider. O seguinte é o conteúdo do 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);
        }
    }
}

A seguir, as modificações de arquivo AndroidManifest.xml. Aqui Adicionado <provedor ... /> tag para incluir os nossos provedores de conteúdo:

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

Aqui está o conteúdo de res / layout arquivo / 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>

Certifique-res / valores / arquivo strings.xml tem o seguinte conteúdo:

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

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

</resources>

Vamos apenas executar um aplicativo provedor de conteúdo modificado. Presumo que você criou AVD durante o ambiente de instalação. Abra o projeto no arquivo ativo, clique na barra de ferramentas fotografia Ícone para executar o aplicativo no Android Studio. Estúdio Android instalar o aplicativo no AVD e inicia-lo. Se tudo correr bem, ele será exibido na janela do emulador da seguinte forma:

fotografia

Digite o nome e ano, e clique no botão "Adicionar", que irá adicionar um registro de estudante nos dados, e na parte inferior para excluir uma mensagem. conteúdo de informação exibe um número de registros adicionados ao provedor de conteúdo banco de dados URI. Esta operação utiliza o método de inserção (). Repita esse processo para adicionar mais estudantes na base de dados do nosso provedor de conteúdo.

fotografia

Depois de concluir o registro de banco de dados é adicionado, é hora de dar a volta ao provedor de conteúdo requer esses registros. Clique no botão "Pesquisar", que virá para recuperar e exibir todos os dados gravados através da aplicação do método query ().

Você pode fornecer método de retorno MainActivity.java para preparar atualizar e excluir operações e modificar a interface do usuário para adicionar atualizar e excluir operações.

Você pode usar o conteúdo existente fornecido desta forma por tais contatos. Você pode também desta forma para desenvolver uma boa aplicação orientado para o banco de dados, você pode ser realizada como descrito acima é conhecido como uma instância de operações de banco de dados, tais como leitura, escrita, atualizar e excluir.