Подтвердить что ты не робот

Что такое класс контракта и как он используется?

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

Поблагодарили бы за помощь в этом.

Спасибо!

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

        .
        .
        .
    }
}

Ответ 3

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

Ответ 4

Контрактный класс - это простой класс, который содержит константы таблицы, которая должна быть создана в БД SQL Lite. Мы можем добавить внутренние классы, основываясь на количестве требуемых таблиц. Сделайте класс контракта окончательным, чтобы константы таблицы не могли быть изменены.

Класс контракта действует как контейнер табличных классов, никаких дополнительных изменений не требуется

Классы таблиц (внутренние классы) могут реализовывать или не реализовывать BaseColumns.

Надеюсь, что это дает четкую картину класса контракта! :-)