Android. Content Providers



Documentos relacionados
Ejercicios - Persistencia en Android: proveedores de contenidos y SharedPreferences

Programación Android. Rafael Morón Abad

Almacenamiento de datos. JOSE LUIS BERENGUEL GÓMEZ Febrero 2012

1. DML. Las subconsultas

Práctica sobre compartición de instancias remotas.

LAS SUBCONSULTAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Ejercicios - Persistencia en Android: ficheros y SQLite

TP Nº4 Android - SQLite Fecha Miércoles 2014/08/29 Profesor: Pablo Ulman (Polshu)

MySQL y Sesiones en PHP. Área de Ingeniería Telemática

MODELO DE IMPLEMENTACIÓN

MANUAL BÁSICO DEL LENGUAJE SQL

Capitulo 4: Componentes Android

CONSULTAS BASICAS EN SQL SERVER

CONSULTAS DE RESUMEN SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Unidad IV. Aplicaciones sobre Base de Datos

SQL (Structured Query Language)

Almacenamiento en Android

Trabajos de Ampliación. Bases de datos NoSQL.

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Persistencia en Android: ficheros y SQLite

SESIÓN 5 MANEJO DE BASES DE DATOS SQLITE

CONSULTAS CON SQL. 3. Hacer clic sobre el botón Nuevo de la ventana de la base de datos. Aparecerá el siguiente cuadro de diálogo.

2.4. BASES DE DATOS SQLITE

Ejercicios - Servicios

Consultas con combinaciones

Practica 11: Conexión de Java con Bases de datos Access

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

1.264 Tema 7. Introducción a SQL

Patrones para persistencia (I) Ingeniería del Software II

Listados y Etiquetas personalizados de PrefGest WhitePaper Julio 2008

7. Manejo de Archivos en C.

Restricciones (constraints) FOREIGN KEY

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

%& %)& '$!%*+ $, %%%&$ %%

A.1. Definiciones de datos en SQL

Modelos y Bases de Datos

Bases de Datos: Structured Query Language (SQL)

Guía de implementación Softland en SQL Server Versión 1.0

Bases de datos. 1. Introducción

Tablas internas 1-12

Prof. Dr. Paul Bustamante

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Curso PUDE. Desarrollo de Aplicaciones Móviles en Android

Persistencia. Mecanismos de persistencia. Preferencias. Curso 12/13

Programación Orientada a Objetos con Java

IVista: es la interfaz con la que el Presentador se comunica con la vista.

Introducción Delicious Algunas características: Sitio para acceder a esta herramienta Qué es Delicious?...

Curso 12/13. Desarrollo de Aplicaciones Android. Persistencia

Tema 4. Manipulación de datos con SQL

El lenguaje SQL es un lenguaje estándar para el acceso y

BASES DE DATOS OFIMÁTICAS

Microsoft SQL Server 2005

- Bases de Datos - - Diseño Físico - Luis D. García

U2. Introducción al desarrollo de aplicaciones móviles Smartphone y Android Desarrollo de Aplicaciones III TIC-UTSV Enero 2015 I.S.C.

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

Programación Orientada a Objetos en Java

PHP Perfect SQL v1.0 (SQL perfectas en PHP)

Parsear HTML con htmlparser para Android Guillem Pérez

TRANSACT-SQL, DISEÑO Y PROGRAMACIÓN DE BASES DE DATOS EN SQL SERVER 2008

Procedimientos para agrupar y resumir datos

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Nociones de performance

Programación Android. Rafael Morón Abad

Patrones Creacionales Builder. Patrones Creacionales Abstract Factory. Patrones Creacionales Singleton. Patrones Creacionales Prototype

Servicio de resolución de nombres (DNS)

Tema 11 Bases de datos. Fundamentos de Informática

INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Dossier de prácticas

Bases de datos relacionales y el modelo entidad-relación

Servicios - Ejercicios

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Programación de sitios web Act 11: Reconocimiento de la unidad 3

COMANDOS DE SQL, OPERADORES, CLAUSULAS Y CONSULTAS SIMPLES DE SELECCIÓN

Modo básico de funcionamiento del módulo Velneo vmodapache V7

Uso de excepciones en Java

Introducción a la programación orientada a objetos

Desarrollo de Servicios Web con JBuilder

Ingeniería del Software Arquitectura Física en 3 niveles

SQL (Structured Query Language)- DML

Práctica 3. Consultas SQL

3.9 Patrón Distributed callback

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario

Oficina Online. Manual del administrador

Oracle básico (IV): Programación en PL/SQL

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

MANUAL DE LA CONFIGURACIÓN Y USO DEL MÓDULO DE ASM PARA PRESTASHOP

ATLAS MANUAL DE USUARIO SERVICIO DE TRAZAS

1. Como empezar 1.1. Arquitectura Android 1.2. Dalvik VM 1.3. Componentes de Android 1.4. Entorno de Desarrollo Android 1.5. Una Aplicación sencilla

Manual del Protocolo XML-RPC de Mensajería Negocios

Sesión 20. MVC en ruby on rails. Luisa Fernanda Rincón Pérez

Administración de la producción. Sesión 10: Gestor de Base de Datos (Access)

Manual de instalación Actualizador masivo de Stocks y Precios

Desarrollo de apps para móviles Android. Conceptos básicos de las aplicaciones Android

Transcripción:

Android Content Providers

Content-Providers Persistencia: Manejar datos y exponerlos a otras aplicaciones. Interfaz con un conjunto de métodos estándar. Único modo de compartir datos entre aplicaciones. Android provee numerosos ContentProviders básicos (audio, video, imágenes, contactos, etc.) Paquete android.provider

Content-Providers Hacer tus datos públicos: Crear tu propio Content-Provider (extender subclase ContentProvider). Añadir los datos a uno existente: Mismo tipo de datos Permisos para escribir

Content Resolver Interfaz común para Hacer consultas Proveer resultados Insertar, modificar y borrar datos. ContentResolver: Permite trabajar con los ContentProviders: Se obtiene llamando al método getcontentresolver() dentro de la implementación de una Activity u otro componente de la aplicación. Android identifica el ContentProvider objetivo de la query y se asegura de que está levantado y ejecutándose. El sistema se encarga de instanciar todos los ContentProvider. Normalmente, solo hay una instancia para cada tipo de ContentProvider El contentprovider puede comunicarse con ContentResolver de otras aplicaciones. ContentResolver y ContentProvider se encargan de la comunicación entre procesos

Modelo de datos _ID NUMBER NUMBER_KEY LABEL NAME TYPE 13 (425) 555 6677 425 555 6677 Kirkland office Bully Pulpit TYPE_WORK 44 (212) 555-1234 212 555 1234 NY apartment Alan Vain TYPE_HOME 45 (212) 555-6657 212 555 6657 Downtown office Alan Vain TYPE_MOBILE 53 201.555.4433 201 555 4433 Love Nest Rex Cars TYPE_HOME

URI URI identifica el conjunto de datos (tabla). Una URI distinta para cada tabla Un ContentProvider expone varias URIs Es buena idea definir una constante para la URI. Ejemplos: android.provider.contacts.phones.content_uri android.provider.contacts.photos.content_uri Cada método de ContentResolver lleva como primer argumento la URI. Indica con qué ContentProvider y con qué tabla debe hablar.

URI A: Prefijo estándar. Nunca modificar B: Authority. Identifca el CP, fully-qualified class name, así se asegura unicidad. C: Determina el tipo de datos a manejar. Puede tener cero (si solo maneja un tipo) o más segmentos. D: Identificador de la fila (_ID). Va vacío si hace una query a un conjunto de filas.

Content-Provider Query Se necesitan tres cosas: URI Nombre de los campos (columnas) Tipo de los campos (columnas) ContentResolver.query() Activity.managedQuery() La activity controla el ciclo de vida del Cursor Se descarga cuando la activity se pausa Hace requery cuando se reinicia. Activity.startManagingCursor(Cursor c): Provoca que la activity maneje el Cursor

Content-Provider Query public final Cursor managedquery (Uri uri, String[] projection, String selection, String[] selectionargs, String sortorder) uri: La URI del ContentProvider a consultar. Se puede indicar el id de la fila: content://..../23 projection: Columnas a retornar. selection: Cláusula SQL WHERE. selectionargs: Argumentos de la selection para completar (? PreparedStatements). sortorder: SQL ORDER BY clause.

Content-Provider Query Ejemplo helpers para uris Valor null retorna todas las columnas/filas

[Content-Provider] Query Interfaz BaseColumns: _ID, _COUNT

Nueva API 2.0 Tres tipos de tablas: Contact, Raw Contact, Data Data: Tabla genérica. Guarda todo tipo de información (Nº Tlf, Email, Foto...) Cada fila indica el tipo a través de MIME type ContactsContract.CommonDataKinds Subclases para tipos comunes Se pueden definir propios MIME types. Una fila de RawContact representa un conjunto de Data's asociada a una fuente de contactos. Ej. Contacto de google, facebook, etc. Una fila de Contact representa un conjunto de RawContact's de un mismo contacto

[ContentProvider] Nueva API

ContactsContract.Data Data es una tabla genérica, según el MIMETYPE, determina el significado de las columnas DATA1 a DATA15. Ej. Phone.CONTENT_ITEM_TYPE DATA1= Número de teléfono Ej. Email.CONTENT_ITEM_TYPE DATA1 = email Se definen tipos comunes de datos, como ContactsContract.CommonDataKinds.Phone o ContactsContract.CommonDataKinds.Email, y sus alias. Ej: Phone.NUMBER = Data.DATA1 Data.DATA1 está indexada. Data.DATA15 se usa para BLOBs

Leer datos del cursor Debes saber el tipo de dato de la columna Cursor.getBlob(). Devuelve byte[] ContentResolver.openInputStream() - leer fichero

Modificar datos Añadir registros Añadir nuevos valores a registros existentes Batch updating Borrar registros Se necesita tener permisos! Ej. <uses-permission android:name="android.permission.read_contacts"> </uses-permission> <uses-permission android:name="android.permission.write_contacts"> </uses-permission>

Insertar datos Ej. Contactos API 1.x Se utiliza un Map (ContentValues) que relacione columna y valor Llamar a ContentResolver.insert( URI, ContentValues) Devuelve la URI completa, referente al registro insertado Con esta URI, puedes pedir un cursor. import android.provider.contacts.people; import android.content.contentresolver; import android.content.contentvalues; ContentValues values = new ContentValues(); // Add Abraham Lincoln to contacts and make him a favorite. values.put(people.name, "Abraham Lincoln"); // 1 = the new contact is added to favorites // 0 = the new contact is not added to favorites values.put(people.starred, 1); Uri uri = getcontentresolver().insert(people.content_uri, values);

Añadir datos Ej. Contactos API 2.x ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(contentprovideroperation.newinsert(contactscontract.rawcontacts.content_uri).withvalue(contactscontract.rawcontacts.account_type, "accountname@gmail.com").withvalue(contactscontract.rawcontacts.account_name, "com.google").build()); ops.add(contentprovideroperation.newinsert(contactscontract.data.content_uri).withvaluebackreference(contactscontract.data.raw_contact_id, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name).build()); ops.add(contentprovideroperation.newinsert(contactscontract.data.content_uri).withvaluebackreference(contactscontract.data.raw_contact_id, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone).withvalue(contactscontract.commondatakinds.phone.type, ContactsContract.CommonDataKinds.Phone.TYPE_HOME).build()); try { cr.applybatch(contactscontract.authority, ops); } catch (RemoteException e) { e.printstacktrace(); } catch (OperationApplicationException e) { e.printstacktrace(); }

Update y Delete public final int update (Uri uri, ContentValues values, String where, String[] selectionargs) Devuelve el número de filas actualizadas public final int delete (Uri url, String where, String[] selectionargs) Devuelve el número de filas borradas. Si el ContentProvider permite transacciones, la operación es atómica.

Crear un ContentProvider!!! Pasos Instalar un sistema para guardar datos: SQLite: Viene la librería en Android Extender la clase ContentProvider query() insert() update() delete() gettype() oncreate() Declarar el ContentProvider en el Manifest

Subclase ContentProvider query() Retorna un Cursor. Android provee Cursores prefabricados, como SQLiteCursor, Matrix Cursor. Deben programarse de modo Thread-safe, ya que un CP puede llamarse desde varios CR ContentResolver.notifyChange() avisa a los listener de que han cambiado los datos

Subclase ContentProvider Consejos Definir la URI como constante: public static final Uri CONTENT_URI = Uri.parse("content://com.example.codelab.transportationprovider"); Definir URIs para subtablas si tiene, con el mismo authority content://com.example.codelab.transportationprovider/train content://com.example.codelab.transportationprovider/air/domestic Definir constantes para las columnas Consejo: Mismo nombre que las columnas de las tablas Definir una columna _id con la constante _ID Si usas SQLite: INTEGER PRIMARY KEY [AUTOINCREMENT] Con AUTOINCREMENT Al insertar fila, coge el valor como si fuera una seq Sin AUTOINCREMENT Al insertar file, coge el maximo de los _ID Documentar el tipo de dato de cada columna ( para los clientes)

Subclase ContentProvider Consejos Si defines un nuevo tipo de datos, define un MIME implementando ContentProvider.getType(). El MIME depende de la URI, no es lo mismo pedir un registro que varios registros. Para saber el MIME que tienes que devolver, ayúdate de la URI para distinguir si lo que piden. For a single record: vnd.android.cursor.item/vnd.yourcompanyname.contenttype For example, a request for train record 122, like this URI, content://com.example.transportationprovider/trains/122 might return this MIME type: vnd.android.cursor.item/vnd.example.rail For multiple records: vnd.android.cursor.dir/vnd.yourcompanyname.contenttype For example, a request for all train records, like the following URI, content://com.example.transportationprovider/trains might return this MIME type: vnd.android.cursor.dir/vnd.example.rail

ContentResolver Subclase Consejos Definir un dato binario muy grande como para poner en tabla: El campo de ese dato debería devolver una content URI El CP debería también definir un campo _data con la ruta del fichero Con la URI obtenida, el cliente llama a ContentResolver.openInputStream() Entonces, internamente el CP hace una petición al campo _data. Porque? El CP tiene más permisos y solamente ofrece un wrapper al cliente.

Declarar el ContentProvider Etiqueta <provider> en el AndroidManifest.xml name: nombre de la subclase CP authorities: Parte authority de la URI, omitiendo la parte content:// Especificar permisos multiprocess: true Permite una instancia del CP en cada cliente. Se ahorra IPC.

SQLite! ContentProvider

SQLite Cualquier BD que crees será accesible solo dentro de tu aplicación. Para crear una BD en SQLite se recomienda extender subclase de SQLiteOpenHelper y sobreescribir oncreate(), incluyendo el código de creación de BD. Instance objeto SQLiteOpenHelper y... Para escribir en BD: helper.getwritabledatabase() Para leer de BD: getreadabledatabase() Devuelven objeto SQLiteDatabase, con métodos para operar con BD: public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionargs, String groupby, String having, String orderby, String limit) public long insert (String table, String nullcolumnhack, ContentValues values) public int delete (String table, String whereclause, String[] whereargs) public int update (String table, ContentValues values, String whereclause, String[] whereargs)

SQLite Implementación de ejemplo: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-conte ntpro ORM http://ormlite.com/sqlite_java_android_orm.shtml