Что такое класс контракта и как он используется - PullRequest
26 голосов
/ 11 февраля 2012

В недавно обновленном Android Dev Guide документация для провайдеров контента содержит раздел под названием Классы контрактов . Хотя есть ссылка на пример для контактов, не сразу было понятно, что такое класс контракта и как его создать для моего пользовательского контент-провайдера

Буду признателен за помощь.

Спасибо!

Ответы [ 3 ]

20 голосов
/ 28 марта 2016

Что такое класс контракта?

Класс контракта - это класс public final, который содержит определения констант для URI, имен столбцов, типов MIME и других метаданных о ContentProvider. Он также может содержать вспомогательные методы static для управления URI.

Почему это используется?

  1. Класс Контракта устанавливает контракт между контентом провайдер и другие приложения. Это гарантирует, что ваш доступ к контент-провайдеру можно получить корректно, даже если есть изменения к фактическим значениям URI, имен столбцов и т. д.
  2. Поскольку он предоставляет мнемонические имена для своих констант, разработчики менее вероятно использование неправильных значений для имен столбцов или URI.
  3. Легко сделать документацию Javadoc доступной для клиентов, которые хотите использовать своего контент-провайдера.

Как это используется?

Вот пример фрагмента класса Contract, разработанный для приложения погоды, который содержит две таблицы: таблицу погоды и таблицу местоположений. Комментарии и некоторые методы пропущены, чтобы сохранить его небольшим. Как правило, это должно быть хорошо прокомментировано.

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);
        }

        .
        .
        .
    }
}
15 голосов
/ 11 февраля 2012

Класс контракта определяет константы, которые помогают приложениям работать с URI контента, именами столбцов, намеренными действиями и другими функциями поставщика контента.Контрактные классы не включаются автоматически с поставщиком;разработчик провайдера должен определить их, а затем сделать их доступными для других разработчиков.

Вы можете создать свой собственный класс Contract и определить там некоторые константы.Например, имена столбцов, которые вы позже можете вызвать в коде, который выполняет запросы к базе данных и т. Д.

Хороший пример использования класса Contract см. В этой теме Android - Как загрузить фотографию контакта?

3 голосов
/ 29 января 2015

Contract - это контейнер для констант, которые определяют имена для таблиц и столбцов URI.Он также предоставляет одинаковые константы для всех других классов в том же пакете.

...