9.7 KiB
Интеграция Supabase - Руководство
Обзор изменений
Проект был переработан для использования Supabase вместо текущего API для получения данных о радиостанциях и категориях.
Структура базы данных Supabase
Таблица Category
CREATE TABLE Category (
id INT PRIMARY KEY,
category_name TEXT NOT NULL,
category_image TEXT,
category_status TEXT,
featured BOOLEAN,
last_update TIMESTAMP
);
Поля:
id- ID категории (целое число)category_name- Название категорииcategory_image- URL изображения категории (опционально)category_status- Статус категории (опционально)featured- Избранная категория (опционально)last_update- Дата последнего обновления (опционально)
Таблица Radio
CREATE TABLE Radio (
id INT PRIMARY KEY,
category_id INT,
radio_name TEXT NOT NULL,
radio_image TEXT,
radio_url TEXT NOT NULL,
radio_status TEXT,
view_count INT DEFAULT 0,
featured BOOLEAN,
type TEXT,
last_update TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES Category(id)
);
Поля:
id- ID радиостанции (целое число)category_id- ID категории (внешний ключ)radio_name- Название радиостанцииradio_image- URL изображения (опционально)radio_url- URL потока радиостанцииradio_status- Статус радиостанции (опционально)view_count- Количество просмотровfeatured- Избранная станция (опционально)type- Тип радиостанции (опционально)last_update- Дата последнего обновления (опционально)
Конфигурация подключения
URL: https://emxgttrptqqaywszojxu.supabase.co
API Key: sb_publishable_J9s-q-GiOq2g3v5EHmdYrA_IzVzFLVe
Эти параметры находятся в файле SupabaseClient.kt.
Добавленные файлы
1. app/src/main/java/com/yaros/RadioUrl/core/supabase/SupabaseClient.kt
Конфигурация клиента Supabase с установленными модулями Postgrest и Realtime.
2. app/src/main/java/com/yaros/RadioUrl/core/supabase/SupabaseRepository.kt
Основной репозиторий для работы с Supabase. Содержит методы:
getCategories()- получить все категорииgetAllStations()- получить все радиостанцииgetStationsByCategory(categoryName)- получить станции по категорииsearchStations(query)- поиск радиостанцийgetStationById(stationId)- получить станцию по IDupdateStationViews(stationId, newViews)- обновить просмотрыgetCategoryById(categoryId)- получить категорию по ID
3. app/src/main/java/com/yaros/RadioUrl/core/supabase/SupabaseApiRepository.kt
Адаптер для совместимости с существующим ApiRepository. Преобразует данные из Supabase в формат, используемый в приложении.
Методы:
getHomeData()- данные для главного экранаgetCategories()- список категорийgetRecentRadio()- последние радиостанцииgetCategoryDetail(categoryId, filter)- станции категорииsearch(query)- поиск станцийsearchRTL(query)- RTL поискupdateStationViews(stationId)- обновить просмотры
Изменённые файлы
1. app/build.gradle
Добавлены зависимости:
// Supabase
implementation platform('io.github.jan-tennert.supabase:bom:3.0.3')
implementation 'io.github.jan-tennert.supabase:postgrest-kt'
implementation 'io.github.jan-tennert.supabase:realtime-kt'
implementation 'io.ktor:ktor-client-android:3.0.3'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3'
Добавлен плагин:
id 'org.jetbrains.kotlin.plugin.serialization' version '2.1.10'
2. Fragment файлы
Обновлены для использования SupabaseApiRepository:
HomeFragment.ktCategoriesFragment.ktCategoryStationsFragment.ktCatalogFragment.kt
Изменения:
// Было:
import com.yaros.RadioUrl.core.APIInterface.ApiClient
import com.yaros.RadioUrl.core.APIInterface.ApiRepository
private val apiRepository by lazy { ApiRepository(ApiClient.apiService) }
// Стало:
import com.yaros.RadioUrl.core.supabase.SupabaseApiRepository
private val apiRepository by lazy { SupabaseApiRepository() }
И обновлены типы результатов:
// Было:
is ApiRepository.NetworkResult.Success -> { ... }
is ApiRepository.NetworkResult.Error -> { ... }
// Стало:
is SupabaseApiRepository.NetworkResult.Success -> { ... }
is SupabaseApiRepository.NetworkResult.Error -> { ... }
Следующие шаги
1. Синхронизация Gradle
После внесения изменений необходимо синхронизировать проект с Gradle:
- В Android Studio: File → Sync Project with Gradle Files
- Или нажмите кнопку "Sync Now" в верхней части экрана
2. Заполнение базы данных
Необходимо заполнить таблицы category и radio в Supabase данными.
Пример для категорий:
INSERT INTO Category (id, category_name, category_image, category_status, featured, last_update) VALUES
(1, 'Rock', 'https://example.com/rock.jpg', 'active', true, NOW()),
(2, 'Pop', 'https://example.com/pop.jpg', 'active', true, NOW()),
(3, 'Jazz', 'https://example.com/jazz.jpg', 'active', false, NOW());
Пример для радиостанций:
INSERT INTO Radio (id, category_id, radio_name, radio_image, radio_url, radio_status, view_count, featured, type, last_update) VALUES
(1, 1, 'Rock FM', 'https://example.com/rockfm.jpg', 'http://stream.rockfm.com/live', 'active', 0, true, 'live', NOW()),
(2, 2, 'Pop Radio', 'https://example.com/popradio.jpg', 'http://stream.popradio.com/live', 'active', 0, false, 'live', NOW());
3. Настройка прав доступа в Supabase
Убедитесь, что в Supabase настроены правильные политики доступа (RLS - Row Level Security):
-- Разрешить чтение всем
CREATE POLICY "Allow public read access" ON Category FOR SELECT USING (true);
CREATE POLICY "Allow public read access" ON Radio FOR SELECT USING (true);
-- Разрешить обновление просмотров
CREATE POLICY "Allow update views" ON Radio FOR UPDATE USING (true);
4. Тестирование
После синхронизации и заполнения базы данных:
- Запустите приложение
- Проверьте загрузку категорий на главном экране
- Проверьте загрузку радиостанций
- Проверьте поиск
- Проверьте переход в категории
Отладка
Если возникают проблемы:
-
Проверьте логи: Все ошибки логируются с тегами:
SupabaseRepositorySupabaseApiRepositoryHomeFragmentCategoriesFragmentCategoryStationsFragmentCatalogFragment
-
Проверьте подключение к Supabase:
- URL и API Key корректны
- Таблицы существуют
- Политики доступа настроены
-
Проверьте структуру данных:
- Поля в таблицах соответствуют DTO классам
- Данные в правильном формате
Возврат к старому API (если нужно)
Если нужно вернуться к старому API, просто измените импорты обратно:
// В каждом Fragment:
import com.yaros.RadioUrl.core.APIInterface.ApiClient
import com.yaros.RadioUrl.core.APIInterface.ApiRepository
private val apiRepository by lazy { ApiRepository(ApiClient.apiService) }
// И верните типы результатов:
is ApiRepository.NetworkResult.Success -> { ... }
is ApiRepository.NetworkResult.Error -> { ... }
Преимущества Supabase
- Реальное время: Возможность подписки на изменения данных
- Простота: Не нужен отдельный backend сервер
- Масштабируемость: Автоматическое масштабирование
- Безопасность: Встроенная аутентификация и авторизация
- Бесплатный план: Достаточно для разработки и небольших проектов
Контакты и поддержка
При возникновении вопросов обращайтесь к документации: