O que é uma classe contratual e como é utilizada
no Guia Dev Android recentemente actualizado, a documentação para os fornecedores de conteúdos contém uma secção intitulada classes de contratos. Embora exista um link para um exemplo de contatos, não ficou claro imediatamente o que é uma classe de contrato e como posso criar um para o meu fornecedor de conteúdo personalizado
Agradecia uma ajuda nisto. Obrigado!4 answers
Podes fazer a tua própria classe contratual e definir algumas constantes. Por exemplo, nomes de colunas que você pode mais tarde chamar em código que faz consultas para a base de dados etc.Uma classe de contrato define constantes que ajudam as aplicações a trabalhar com os URIs de conteúdo, nomes de colunas, ações de intenção e outras características do fornecedor. As classes contratuais não são incluídas automaticamente com um provedor; o desenvolvedor do provedor tem que defini-los e, em seguida, torná-los disponíveis para outros desenvolvedores.
Bom exemplo de como a classe de contrato é usada veja este tópico - Android-Como é que eu carrego uma foto de contacto?
O que é uma classe de contrato?
Uma classe contratual é uma public
final
classe que contém definições constantes para os URIs, nomes de colunas, tipos MIME e outros meta-dados sobre o ContentProvider
. Também pode conter métodos auxiliares static
para manipular o URIs.
Por que é utilizado?
-
A classe de Contrato estabelece um contrato entre o conteúdo
provedor e outras aplicações. Ele garante que o seu
fornecedor de conteúdo pode ser acessado corretamente, mesmo se há alterações
aos valores reais dos URIs, nomes das colunas, etc.
- Uma vez que fornece nomes mnemónicos para as suas constantes, os programadores são menos provável de utilizar valores incorrectos para nomes de colunas ou URIs. É fácil colocar a documentação Javadoc à disposição dos clientes que quer usar o seu fornecedor de conteúdo.
Como se utiliza?
Aqui está um excerto de classe de contrato de amostra concebido para um aplicativo meteorológico contendo duas tabelas: tabela meteorológica e mesa de localização. Os comentários e alguns métodos são ignorados para mantê-lo pequeno. Geralmente deve ser bem comentado.
public class WeatherContract {
public static final String CONTENT_AUTHORITY =
"com.example.android.sunshine.app";
public static final Uri BASE_CONTENT_URI =
Uri.parse("content://" + CONTENT_AUTHORITY);
public static final String PATH_WEATHER = "weather";
public static final String PATH_LOCATION = "location";
/**Inner class that defines the table contents of the location table. */
public static final class LocationEntry implements BaseColumns {
public static final String TABLE_NAME = "location";
public static final String COLUMN_LOCATION_SETTING = "location_setting";
public static final String COLUMN_CITY_NAME = "city_name";
public static final String COLUMN_COORD_LAT = "coord_lat";
public static final String COLUMN_COORD_LONG = "coord_long";
public static final Uri CONTENT_URI =
BASE_CONTENT_URI.buildUpon().appendPath(PATH_LOCATION).build();
// Custom MIME types
public static final String CONTENT_TYPE =
ContentResolver.CURSOR_DIR_BASE_TYPE +
"/" + CONTENT_AUTHORITY + "/" + PATH_LOCATION;
public static final String CONTENT_ITEM_TYPE =
ContentResolver.CURSOR_ITEM_BASE_TYPE +
"/" + CONTENT_AUTHORITY + "/" + PATH_LOCATION;
// Helper method
public static Uri buildLocationUri(long id) {
return ContentUris.withAppendedId(CONTENT_URI, id);
}
}
/** Inner class that defines the table contents of the weather table. */
public static final class WeatherEntry implements BaseColumns {
public static final String TABLE_NAME = "weather";
public static final String COLUMN_LOC_KEY = "location_id";
public static final String COLUMN_DATE = "date";
public static final String COLUMN_WEATHER_ID = "weather_id";
public static final String COLUMN_SHORT_DESC = "short_desc";
public static final String COLUMN_MIN_TEMP = "min";
public static final String COLUMN_MAX_TEMP = "max";
public static final String COLUMN_HUMIDITY = "humidity";
public static final String COLUMN_PRESSURE = "pressure";
public static final String COLUMN_WIND_SPEED = "wind";
public static final String COLUMN_DEGREES = "degrees";
public static final Uri CONTENT_URI =
BASE_CONTENT_URI.buildUpon().appendPath(PATH_WEATHER).build();
public static final String CONTENT_TYPE =
ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY +
"/" + PATH_WEATHER;
public static final String CONTENT_ITEM_TYPE =
ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY +
"/" + PATH_WEATHER;
// Helper method.
public static Uri buildWeatherUri(long id) {
return ContentUris.withAppendedId(CONTENT_URI, id);
}
.
.
.
}
}
Contract
é um container para constantes que definem nomes para tabelas e Colunas URIs. Ele também fornece as mesmas constantes em todas as outras classes do mesmo pacote.
A classe contratual é uma classe simples que possui as constantes de uma tabela que deve ser criada em SQL Lite DB. Podemos adicionar classes internas com base no número de tabelas necessárias. Fazer a classe de contrato final para que as constantes da tabela não possam ser alteradas.
A classe contratual funciona como um contentor das classes de tabela, não há necessidade de quaisquer outras alterações
As classes de tabela (classes interiores) podem ou não implementar BaseColumns .
Espero que isto dê uma imagem clara da classe contratual!! :-)