Proveedor de contenido en Android

Proveedor de contenido en Android

En Android, ContentProvider es uno de los cuatro componentes principales que se utilizan para compartir y administrar datos entre diferentes aplicaciones. Proporciona una forma estandarizada de acceder y administrar los datos de una aplicación, lo que permite que varias aplicaciones compartan datos de forma segura sin acceder directamente a las bases de datos o archivos de cada una.

ContentProvider se utiliza generalmente para implementar funciones como compartir datos, consultar datos y actualizar datos. Actúa como la capa intermedia para el acceso a los datos, abstrayendo los datos en un formulario similar a una tabla de base de datos y proporcionando un conjunto de URI (identificador uniforme de recursos) estándar para identificar y acceder a estos datos.

Principales características y usos:

  1. Intercambio de datos: ContentProvider permite compartir datos entre diferentes aplicaciones para lograr funciones de intercambio y uso compartido de datos.
  2. Consulta de datos: otras aplicaciones pueden iniciar solicitudes de consulta a ContentProvider a través de la interfaz ContentResolver para obtener resultados de consultas para datos específicos.
  3. Actualización de datos: ContentProvider también permite que otras aplicaciones agreguen, eliminen y modifiquen datos a través de la interfaz ContentResolver.
  4. Control de permisos: ContentProvider puede controlar el acceso a los datos y restringir el acceso de ciertas aplicaciones a los datos.

ContentProvider generalmente utiliza una base de datos, archivos, red u otro método de almacenamiento SQLite para guardar datos. A través de la interfaz ContentResolver, otras aplicaciones pueden agregar, eliminar, modificar y consultar fácilmente estos datos sin preocuparse por el método de almacenamiento específico de los datos.

El propio sistema Android proporciona muchos ContentProviders de uso común, como libretas de direcciones, bibliotecas multimedia, calendarios, etc., y también permite a los desarrolladores de aplicaciones personalizar ContentProviders para lograr el intercambio y la administración de datos.

En resumen, ContentProvider es un componente importante para el intercambio y la gestión de datos en Android. Proporciona una interfaz de acceso a datos estándar para aplicaciones, lo que hace que compartir e intercambiar datos sea más fácil y seguro.

Ejemplos de código

Bien, tomemos un ejemplo de código simple para ilustrar cómo crear y usar un ContentProvider.

Supongamos que tenemos una aplicación simple que almacena los nombres y edades de algunos estudiantes y queremos permitir que otras aplicaciones consulten y actualicen la información de este estudiante.

Primero, necesitamos definir una clase ContentProvider personalizada, llamémosla StudentProvider. Esta clase debe heredar de la clase base ContentProvider proporcionada por Android e implementar varios métodos necesarios.

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class StudentProvider extends ContentProvider {
    
    

    // Authority是用于唯一标识ContentProvider的字符串,通常使用应用程序的包名
    private static final String AUTHORITY = "com.example.myapp.studentprovider";

    // 定义一个用于匹配URI的UriMatcher
    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int STUDENT_TABLE_CODE = 1;

    // Content URI的基本格式:content://authority/table_name
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/students");

    private SQLiteDatabase mDatabase;

    @Override
    public boolean onCreate() {
    
    
        // 在这里初始化数据库
        SQLiteOpenHelper dbHelper = new MyDatabaseHelper(getContext());
        mDatabase = dbHelper.getWritableDatabase();

        // 添加UriMatcher匹配规则
        sUriMatcher.addURI(AUTHORITY, "students", STUDENT_TABLE_CODE);

        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    
    
        Cursor cursor = null;

        switch (sUriMatcher.match(uri)) {
    
    
            case STUDENT_TABLE_CODE:
                cursor = mDatabase.query("students", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }

        // 注册观察者,以便在数据发生变化时通知其他应用程序
        cursor.setNotificationUri(getContext().getContentResolver(), uri);

        return cursor;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
    
    
        long rowId = mDatabase.insert("students", null, values);

        if (rowId > 0) {
    
    
            Uri insertUri = ContentUris.withAppendedId(CONTENT_URI, rowId);
            getContext().getContentResolver().notifyChange(insertUri, null);
            return insertUri;
        }

        throw new IllegalStateException("Failed to insert row into " + uri);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    
    
        int count = 0;

        switch (sUriMatcher.match(uri)) {
    
    
            case STUDENT_TABLE_CODE:
                count = mDatabase.update("students", values, selection, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }

        if (count > 0) {
    
    
            getContext().getContentResolver().notifyChange(uri, null);
        }

        return count;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
    
    
        int count = 0;

        switch (sUriMatcher.match(uri)) {
    
    
            case STUDENT_TABLE_CODE:
                count = mDatabase.delete("students", selection, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }

        if (count > 0) {
    
    
            getContext().getContentResolver().notifyChange(uri, null);
        }

        return count;
    }

    @Override
    public String getType(Uri uri) {
    
    
        return null;
    }
}

En este ejemplo, hemos creado una clase ContentProvider llamada StudentProvider. Almacena información de los estudiantes a través de una base de datos SQLite y proporciona métodos para consultar, insertar, actualizar y eliminar información de los estudiantes. Al mismo tiempo, también implementamos la coincidencia de URI y el registro de observadores para garantizar que otras aplicaciones puedan recibir notificaciones cuando cambien los datos.

Cabe señalar que para que este ContentProvider entre en vigor en AndroidManifest.xml, debe registrarlo en el archivo Manifest y establecer una Autoridad única para él. Al mismo tiempo, también debe declarar los permisos adecuados en el archivo de manifiesto para proteger el acceso a los datos.

esto es sólo

Supongo que te gusta

Origin blog.csdn.net/QYgujingjing/article/details/132090814
Recomendado
Clasificación