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
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;Fazendo updates de registros em batch
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);
}
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:
Postar um comentário