Provedores de Conteúdo

Documentos relacionados
Programação para a Plataforma Android Aula 11. Banco de Dados

Comunicação entre A0vidades

Android Banco de Dados. Ivan Nicoli

Programação para a Plataforma Android Aula 7. Mul$mídia

Computação II Orientação a Objetos

Módulo 2 - Novas Activities Android. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Programação para Android. Aula 08: Persistência de dados SQL

Apresentação de um Processo Cria4vo de Desenvolvimento de uma App Android. Realização de Dinâmica Hands- On para Construção de uma App Android

Programação de Dispositivos Móveis

Programação para Dispositivos Móveis

Programação para Android. Aula 06: Activity, menus e action bar

Android Core. Felipe Silveira felipesilveira.com.br. Aula 6

Programação para Android. Aula 05: Estilos e temas; galeria de imagens

Android e Bancos de Dados

Desenvolvimento para Android Prá9ca 2. Prof. Markus Endler

Comunicação via Sockets

Programação de Computadores - I. Profª Beatriz Profº Israel

Módulo 4 - Interface Gráfica Gerenciadores de Layout. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Armazenamento Persistente de Dados

Programação para Dispositivos Móveis

Armazenamento de dados

Interfaces Gráficas parte 3

Introdução ao Android. SECAP 2014 Prof. Rone Ilídio - UFSJ

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Desenvolvimento com Android Studio. Aula 02 Widgets, Manipulação de Dados e Programação de Eventos

Programa de Dispositivos Móveis

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Prof. Jhonatan Fernando

Programação para a Plataforma Android Aula 13. Localização

Desenvolvimento para Android Prá3ca 3. Prof. Markus Endler

Android Layout Manager. Ivan Nicoli

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5.

Especificação do 3º Trabalho

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

insfcanceof new public switch transient while byte continue extends for int null

Computação II Orientação a Objetos

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Programa de Dispositivos Móveis

Display de Cristal Líquido

Programação de Dispositivos Móveis

Programação para Dispositivos Móveis. Banco de Dados (SQLite)

Capítulo 04: Persistência com SQLite

Programação para Android. Aula 10: Acesso a câmera, sms e recursos do aparelho

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p:// h7p://leveme.

Programação para Dispositivos Móveis

Técnicas de Programação II

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Sistema de Digitalização e Gerenciamento de Arquivos On-Line

Banco de Dados Microsoft Access: Criar tabelas

NOVIDADES DO JAVA PARA PROGRAMADORES C

Banco de Dados Microsoft Access: Criar tabelas. Vitor Valerio de Souza Campos

Programação para Android. Aula 07: Persistência de dados Shared Preferences, Internal e External Storage

( TIAGO DOS SANTOS MENDES ) PROGRAMAÇÃO DISPOSITIVOS MOVEIS ANDROID STUDIO

Manual Administrador - Mídia System

Android: Ciclo de vida da Activity

Banco de Dados. Prof. Leonardo Barreto Campos 1

Programação Orientada a Objetos: Lista de exercícios #1. Bruno Góis Mateus

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Computação II Orientação a Objetos

persistência de dados

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

O programa abaixo exemplifica o uso da classe Image para carregar e mostrar uma imagem localizada em um arquivo.

Programação para Dispositivos Móveis

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

Exemplo 1. Um programa que cria uma instância de uma classe que herda da classe Frame

Criando um script simples

The Visgraf Video Database

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Desenvolvimento de Aplicações para Internet Aula 8

Android Core. Felipe Silveira felipesilveira.com.br. Aula 6

Orientação a Objetos

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Trabalho 3: Agenda de Tarefas

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Roteiro do Programa e Entrada/Saída

INTRODUÇÃO 12. DOCUMENTAÇÃO INTRODUÇÃO INTRODUÇÃO

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Java 2 Standard Edition Como criar classes e objetos

PHP INTEGRAÇÃO COM MYSQL PARTE 1

UFG - Instituto de Informática

Modulo IIa Extra: Object

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Implementação de Classe e Auto-Relacionamento em Java

Programação em Java para a Plataforma Android AULA 1. Primeiros Passos

Computação II Orientação a Objetos

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ANDROID APPLICATION PROJECT

Criando documentação com javadoc

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Unidade IV: Ponteiros, Referências e Arrays

Android Binding. Implementando o padrão de projeto MVVM com MVVM_. Saiba como criar um projeto utilizando o padrão de projeto MVVM no Android

Treinamento Excel 2010 Thalles Cezar Montenegro

Companhia de Processamento de Dados do Município de São Paulo. Acessando e manipulando Cubos OLAP Utilizando o MS Excel 2000/XP

Transcrição:

Programação para a Plataforma Android Aula 12 Provedores de Conteúdo O que são provedores de conteúdo? Como ler dados de outras aplicações? Como iden@ficar recursos de forma única? Como deixar dados disponíveis para outras aplicações? Como estabelecer níveis de proteção para dados? Como alterar dados de outras aplicações?

Provedores de Conteúdo Provedores de conteúdo são objetos que armazenam dados de forma permanente, e os tornam disponíveis para as outras aplicações. Android já fornece alguns provedores de conteúdo no pacote android.provider Existem duas formas de tornar dados públicos: extende se a classe ContentProvider, ou insere se os dados nalgum provedor já existente.

Provedores de Conteúdo Provedores de conteúdo são objetos que armazenam dados de forma permanente, e os tornam disponíveis para as outras aplicações. Como podemos localizar um provedor de conteúdo? Android já fornece alguns provedores de conteúdo no pacote android.provider Existem duas formas de tornar dados públicos: extende se a classe ContentProvider, ou insere se os dados nalgum provedor já existente.

Uniform Resource Iden@fier (URI) Provedores de conteúdo são localizados via URIs. Cada @po de dado que o provedor disponibiliza é encontrado via uma URI diferente. O mesmo provedor pode disponibilizar mais de um @po de dado, e portanto usar mais de uma URI. Exemplo: android.provider.contacts.phones.content_uri android.provider.contacts.photos.content_uri

URIs A) Segmento que indica que o dado é fornecido por um provedor de conteúdo. B) Iden@ficador do provedor de conteúdo. C) Tipo (e sub@pos) do dado. D) Iden@ficador de um registro qualquer dos dados. Pode estar ausente.

Definindo Uma URI import android.net.uri; import android.provider.basecolumns; Faz sentido uma interface sem métodos? public interface Constants extends BaseColumns { final String TABLE_NAME = "events"; final String AUTHORITY = "com.aula10"; final Uri CONTENT_URI = Uri.parse("content:// + AUTHORITY + "/" + TABLE_NAME); final String TIME = "@me"; final String TITLE = "@tle"; Como usar essas constantes no código?

E outras constantes import android.net.uri; import android.provider.basecolumns; public interface Constants extends BaseColumns { final String TABLE_NAME = "events"; final String AUTHORITY = "com.aula10"; final Uri CONTENT_URI = Uri.parse("content:// + AUTHORITY + "/" + TABLE_NAME); final String TIME = "Nme"; final String TITLE = "Ntle"; Vale a pena definir também nomes para as colunas de dados como constantes. Esses nomes tendem a ser usados o tempo todo!

Importação Está@ca Esse @po de constante pode ser importada esta@camente. import sta@c com.aula12.constants.authority; import sta@c com.aula12.constants.content_uri; import sta@c com.aula12.constants.table_name; import sta@c android.provider.basecolumns._id; Android já possui um nome predefinido para chaves primárias.

Criando um Provedor de Conteúdo Para criar um provedor de conteúdo, é necessário: Declarar o provedor de conteúdo no arquivo de manifesto. Definir uma forma de armazenar dados. Android provê o banco de dados SQLite, mas qualquer forma de armazenamento pode ser usada. Estender a classe ContentProvider

Declarando a URI no Manifesto <?xml version="1.0" encoding="u/ 8"?> <manifest xmlns:android="h5p://schemas.android.com/apk/res/android" package="com.aula12" android:versioncode="1" android:versionname="1.0"> <applica@on android:icon="@drawable/icon" android:label="@string/app_name"> <provider android:name=".eventsprovider" android:authorines="com.aula12" /> <ac@vity android:name=".events" android:label="@string/app_name"> <intent filter> <ac@on android:name="android.intent.acgon.main" /> <category android:name="android.intent.category.launcher" /> </intent filter> </ac@vity> </applica@on> <uses sdk android:minsdkversion="3" /> </manifest>

Estendendo ContentProvider ContentProvider é uma classe abstrata, contendo seis métodos abstratos: query() insert() update() delete() gettype() oncreate() public class EventsProvider extends ContentProvider { public int delete(uri arg0, String arg1, String[] arg2) { public String gettype(uri uri) { public Uri insert(uri uri, ContentValues values) { public boolean oncreate() { public Cursor query(uri uri, String[] projec@on, String selec@on, String[] selec@onargs, String sortorder) { public int update(uri uri, ContentValues values, String selec@on, String[] selec@onargs) { EventsProvider.java

MIME Se os dados fornecidos pelo provedor de conteúdo são novos, então é preciso definir um formato MIME (mulgpurpose Internet mail extensions) para eles. Nesse caso, é necessário um @po para o registro individual, e um @po para uma lista de registros: EventsProvider.java private sta@c final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.event"; private sta@c final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.example.event";

EventsProvider.java oncreate private sta@c final int EVENTS = 1; private sta@c final int EVENTS_ID = 2; private EventsData events; private UriMatcher urimatcher; O que seria um UriMatcher? E essa classe EventsData? @Override public boolean oncreate() { urimatcher = new UriMatcher(UriMatcher.NO_MATCH); urimatcher.adduri(authority, "events", EVENTS); urimatcher.adduri(authority, "events/#", EVENTS_ID); events = new EventsData(getContext()); return true;

EventsProvider.java query @Override public Cursor query(uri uri, String[] projec@on, String selec@on, String[] selec@onargs, String orderby) { if (urimatcher.match(uri) == EVENTS_ID) { long id = Long.parseLong(uri.getPathSegments().get(1)); selec@on = appendrowid(selec@on, id); SQLiteDatabase db = events.getreadabledatabase(); Cursor cursor = db.query(table_name, projec@on, selec@on, selec@onargs, null, null, orderby); cursor.setno@fica@onuri(getcontext().getcontentresolver(), uri); return cursor;

gettype EventsProvider.java @Override public String gettype(uri uri) { switch (urimatcher.match(uri)) { case EVENTS: return CONTENT_TYPE; case EVENTS_ID: return CONTENT_ITEM_TYPE; default: Onde foram definidas quais URIs esse provedor conhece? throw new IllegalArgumentExcep@on("Unknown URI " + uri);

Qual o propósito dessa linha? EventsProvider.java insert Por que disparamos essa exceção? @Override public Uri insert(uri uri, ContentValues values) { SQLiteDatabase db = events.getwritabledatabase(); if (urimatcher.match(uri)!= EVENTS) { throw new IllegalArgumentExcepNon("Unknown URI " + uri); long id = db.insertorthrow(table_name, null, values); Uri newuri = ContentUris.withAppendedId(CONTENT_URI, id); getcontext().getcontentresolver().nonfychange(newuri, null); return newuri;

EventsProvider.java delete @Override public int delete(uri uri, String selec@on, String[] selec@onargs) { SQLiteDatabase db = events.getwritabledatabase(); int count; switch (urimatcher.match(uri)) { case EVENTS: count = db.delete(table_name, selec@on, selec@onargs); break; case EVENTS_ID: long id = Long.parseLong(uri.getPathSegments().get(1)); count = db.delete(table_name, appendrowid(selec@on, id), selec@onargs); break; default: throw new IllegalArgumentExcep@on("Unknown URI " + uri); getcontext().getcontentresolver().no@fychange(uri, null); return count;

EventsProvider.java update @Override public int update(uri uri, ContentValues values, String selec@on, String[] selec@onargs) { SQLiteDatabase db = events.getwritabledatabase(); int count; switch (urimatcher.match(uri)) { case EVENTS: count = db.update(table_name, values, selec@on, selec@onargs); break; case EVENTS_ID: long id = Long.parseLong(uri.getPathSegments().get(1)); Há que se implementar esse método. count = db.update(table_name, values, appendrowid(selec@on, id), selec@onargs); break; default: throw new IllegalArgumentExcep@on("Unknown URI " + uri); getcontext().getcontentresolver().no@fychange(uri, null); return count;

EventsProvider.java update @Override public int update(uri uri, ContentValues values, String selec@on, String[] selec@onargs) { SQLiteDatabase db = events.getwritabledatabase(); int count; switch (urimatcher.match(uri)) { case EVENTS: count = db.update(table_name, values, selec@on, selec@onargs); break; case EVENTS_ID: long id = Long.parseLong(uri.getPathSegments().get(1)); count = db.update(table_name, values, appendrowid(selec@on, id), selec@onargs); break; default: throw new IllegalArgumentExcep@on("Unknown URI " + uri); getcontext().getcontentresolver().no@fychange(uri, null); return count; Mas, o que ele faz mesmo? private String appendrowid(string selec@on, long id) { return _ID + "=" + id + (!TextU@ls.isEmpty(selec@on)? " AND (" + selec@on + ')' : ""); E como podemos ter acesso a um provedor de conteúdo?

Usando um provedor de conteúdo São necessárias três informações para que possamos ler um provedor de conteúdo: A URI que iden@fica o provedor Os nomes dos campos que queremos ler ou escrever O @po dos dados desses campos. Quais passos precisam ser tomados por uma atividade que lê nosso provedor?

Lendo Dados Events.java private sta@c String[] FROM = { _ID, TIME, TITLE, }; private sta@c String ORDER_BY = TIME + " DESC"; private Cursor getevents() { return managedquery(content_uri, FROM, null, null, ORDER_BY); O que são os argumentos desse construtor? E quais informações seriam necessárias para escrevermos dados?

Inserindo dados no Provedor Events.java private void addevent(string string) { ContentValues values = new ContentValues(); values.put(time, System.currentTimeMillis()); values.put(title, string); getcontentresolver().insert(content_uri, values); Falta agora sermos capazes de exibir os eventos na tela.

ContentProvider vs SQLiteDatabase ContentProvider private Cursor getevents() { return managedquery(content_uri, FROM, null, null, ORDER_BY); SQLiteDatabase private Cursor getevents() { SQLiteDatabase db = events.getreadabledatabase(); Cursor cursor = db.query(table_name, FROM, null, null, null, null, ORDER_BY); startmanagingcursor(cursor); return cursor; private void addevent(string string) { ContentValues values = new ContentValues(); values.put(time, System.currentTimeMillis()); values.put(title, string); getcontentresolver().insert(content_uri, values); private void addevent(string string) { SQLiteDatabase db = events.getwritabledatabase(); ContentValues values = new ContentValues(); values.put(time, System.currentTimeMillis()); values.put(title, string); db.insertorthrow(table_name, null, values);

Events.java Mostrando os Eventos public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.evtlist); addevent("oncreate"); Cursor cursor = getevents(); showevents(cursor); Sera que ele vai ser diferente do método que já tínhamos feito para o banco de dados tradicional? Precisamos implementar esse método.

Mostrando os Eventos Qual deve ser a superclasse dessa atividade? private sta@c String[] FROM = { _ID, TIME, TITLE, }; private sta@c int[] TO = { R.id.rowid, R.id.@me, R.id.@tle, }; Events.java private void showevents(cursor cursor) { SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, FROM, TO); setlistadapter(adapter);

Events.java ListAc@vity public class Events extends ListAc@vity { public void oncreate(bundle savedinstancestate) { private void addevent(string string) { private Cursor getevents() { private void showevents(cursor cursor) { E como poderíamos remover eventos da lista? Qual interface o usuário teria para remover eventos?

Removendo Itens do Provedor Events.java public void onitemclick(adapterview<?> av, View v, int pos, long id) { View v0 = ((RelaNveLayout)v).getChildAt(0); String strid = ((TextView)v0).getText().toString(); Log.v("Events", "DeleNng " + strid); getcontentresolver().delete(content_uri, "_ID = " + strid, null); showevents(getevents()); O que esse código está fazendo? E essa parte, o que faz ela? E esses parâmetros, para que servem eles? E que outras mudanças na classe são necessárias?

Escutadores de Eventos Events.java public class Events extends ListAc@vity implements OnItemClickListener { public void oncreate(bundle savedinstancestate) {... getlistview().setonitemclicklistener(this); public void onitemclick(adapterview<?> av, View v, int pos, long id) {...

Exercício: Menu de Contexto Modifique seu programa, para aceitar um menu de contexto. Esse menu deve ter uma opção para apagar o evento. O menu deve também ter uma opção para visualizar o evento.

Adicionando um menu de contexto @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.evtlist); addevent("oncreate"); registerforcontextmenu(getlistview()); Cursor cursor = getevents(); showevents(cursor); getlistview().setonitemclicklistener(this); E como criamos o menu de contexto?

Definindo o Menu private final int del = 0; private final int show = 1; E como tratamos os eventos? @Override public final void oncreatecontextmenu (final ContextMenu menu, final View v, final ContextMenuInfo menuinfo) { super.oncreatecontextmenu(menu, v, menuinfo); menu.add(menu.none, del, Menu.NONE, "DEL"); menu.add(menu.none, show, Menu.NONE, "SHOW");

Eventos de Contexto public final boolean oncontextitemselected(final MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getmenuinfo(); Rela@veLayout rl = (Rela@veLayout)info.targetView; TextView tv = (TextView)rl.getChildAt(0); String strid = tv.gettext().tostring(); switch (item.getitemid()) { case del:... case show:... return true; Como implementamos o caso de remover o evento?

Apagando uma Entrada public final boolean oncontextitemselected(final MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getmenuinfo(); Rela@veLayout rl = (Rela@veLayout)info.targetView; TextView tv = (TextView)rl.getChildAt(0); String strid = tv.gettext().tostring(); switch (item.getitemid()) { case del: getcontentresolver().delete(content_uri, "_ID = " + strid, null); showevents(getevents()); break; case show: Mostrar o item selecionado é mais complicado

Cursor Um cursor é um iterador. Iterator é um padrão de projetos. O que faz o código abaixo? Cursor cur = managedquery(event, null, null, null, null); Log.v("show", String.valueOf(cur.getColumnCount())); Log.v("show", cur.getcolumnname(0)); Log.v("show", cur.getcolumnname(1)); Log.v("show", cur.getcolumnname(2)); int @mecolumn = cur.getcolumnindex(time); int @tlecolumn = cur.getcolumnindex(title); cur.movetofirst(); String eventstr = cur.getstring(@tlecolumn); eventstr += "(" + cur.getlong(@mecolumn) + ")"; Log.v("show", eventstr); Implemente o caso show de nosso menu.

case show: Uri event = Uri.withAppendedPath(CONTENT_URI, strid); Cursor cur = managedquery(event, null, null, null, null); Log.v("show", String.valueOf(cur.getColumnCount())); Log.v("show", cur.getcolumnname(0)); Log.v("show", cur.getcolumnname(1)); Log.v("show", cur.getcolumnname(2)); int @mecolumn = cur.getcolumnindex(time); int @tlecolumn = cur.getcolumnindex(title); cur.movetofirst(); String eventstr = cur.getstring(@tlecolumn); eventstr += "(" + cur.getlong(@mecolumn) + ")"; Log.v("show", eventstr); break;