Caso prefira, você encontrará todo esse material, em inglês, no site do Developer Android. A tradução e comentários dos materiais eu faço livremente para ajudar a comunidade que fala português.

terça-feira, 12 de abril de 2011

Content Providers - Parte 02

Modificando dados
Dados mantidos por um content provider podem ser modificados das seguintes maneiras:

  • Adicionando novos registros
  • Adicionando novos valores para registros existentes
  • Fazendo updates em registros existentes
  • Excluindo registros
Todas as modificações de dados são conseguidos usando os métodos do ContentResolver. Alguns content providers requerem uma permissão mais restritiva para escrever os dados que para lê-los. Se você não tem permissão para escrever para um content provider, os métodos ContentResolver vão falhar.

Adicionando registros

Para adicionar um novo registro a um content provider, primeiro configura um mapa de pares chave-valor em um objeto ContentValues, onde cada chave bate com o nome de uma coluna do content provider e o valor é o que se deseja alterar para o novo registro nessa coluna. Então chame ContentResolver.insert() e passe a URI para o provider e o mapa de ContentValues. Esse método retorna uma URI completa do novo registro - ou seja, a URI do provedor com o ID aninhado para o novo registro. Você pode então usar essa URI para pesquisar e obter um Cursor do novo registro e para mais tarde modificar seus dados. Aqui está um exemplo:
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);

Adicionando novos valores

Uma vez que o registro existe, você pode adicionar novas informações e modificar as existentes. Por exemplo, o próximo passo para o exemplo acima seria adicionar novas informações de contato - como o nome do telefone - para uma nova entrada de dados.

A melhor maneira de adiciona um registro no banco de dados de contatos é adicionar o nome da tabela onde os novos dados deverão ser adicionados para a URI do registro e então usar essa URI para adicionar novos valores de dados. Cada tabela de contato expõe um nome para uma proposta como uma contante CONTENT_DIRECTORY. O código seguinte continua o código anterior adicionando um número de telefone e um endereço de email para o registro criado:
Uri phoneUri = null;
Uri emailUri = null;


// Add a phone number for Abraham Lincoln.  Begin with the URI for
// the new record just returned by insert(); it ends with the _ID
// of the new record, so we don't have to add the ID ourselves.
// Then append the designation for the phone table to this URI,
// and use the resulting URI to insert the phone number.
phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);


values.clear();
values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE);
values.put(People.Phones.NUMBER, "1233214567");
getContentResolver().insert(phoneUri, values);


// Now add an email address in the same way.
emailUri = Uri.withAppendedPath(uri, People.ContactMethods.CONTENT_DIRECTORY);


values.clear();()
// ContactMethods.KIND is used to distinguish different kinds of
// contact methods, such as email, IM, etc.
values.put(People.ContactMethods.KIND, Contacts.KIND_EMAIL);
values.put(People.ContactMethods.DATA, "test@example.com");
values.put(People.ContactMethods.TYPE, People.ContactMethods.TYPE_HOME);
getContentResolver().insert(emailUri, values);

Você pode colocar pequenos pedados de dados binários dentro de uma tabela chamando a versão de ContentValues.put() que recebe um array de bytes. Isso funcionaria para uma imagem de ícone ou clip de audio, por exemplo. Contudo, se você tem uma quantidade grande de dados binários a serem adicionados, como uma fotografia ou uma música completa, insira uma URI content: para os dados em uma tabela ou chamada ContentResolver.openOutputStream() com o arquivo URI (isso faz com que o content provider para guardar os dados emum arquivo e gravar o caminho deste em um campo escondido no registro).

Nesse sentido, o content provider MediaStore, o principal provider para imagens, audio e dados de vídeo, emprega uma convenção especial. O mesmo URI que é usado com query() ou managedQuery() para obter meta-information sobre os dados binários é usado com openInputStream() para obter dados de si mesmo. Similarmente, a mesma URI que é usada com o insert() para guardar meta-informações no registro do MediaStore é usado com openOutputStream() para inserir os dados por lá. O código seguinte ilustra essa convenção:
import android.provider.MediaStore.Images.Media;
import android.content.ContentValues;
import java.io.OutputStream;


// Save the name and description of an image in a ContentValues map. 
ContentValues values = new ContentValues(3);
values.put(Media.DISPLAY_NAME, "road_trip_1");
values.put(Media.DESCRIPTION, "Day 1, trip to Los Angeles");
values.put(Media.MIME_TYPE, "image/jpeg");


// Add a new record without the bitmap, but with the values just set.
// insert() returns the URI of the new record.
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);


// Now get a handle to the file for that record, and save the data into it.
// Here, sourceBitmap is a Bitmap object representing the file to save to the database.
try {
    OutputStream outStream = getContentResolver().openOutputStream(uri);
    sourceBitmap.compress(Bitmap.CompressFormat.JPEG, 50, outStream);
    outStream.close();
} catch (Exception e) {
    Log.e(TAG, "exception while writing image", e);
}
Fazendo updates de registros em batch

Para fazer o update de registros em batch (por exemplo, para mudar a sigla "NY" para "New York" em todos os .campos), chame o método ContentResolver.update() com a coluna e valores a serem mudados.

Excluindo um registro

Para excluir um registro único, chame ContentResolver.delete() com a URI da linha específica.

Para deletar linhas múltiplas, chame ContentResolver.delete() com a URI do tipo de registro a ser excluído. Por exemplo, android.provider.Contacts.People.CONTENT_URI e uma cláusula SQL Where definindo quais linhas a serem excluídas.

0 comentários:

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
Related Posts Plugin for WordPress, Blogger...