- Как настроить базу данных с Firebase Firestore для Android
- Начало
- Создание проекта в Firebase Console
- Добавление Firebase в приложение Android
- Завершение настройки Firebase Console
- Настройка Firestore в Firebase Console
- Настройка базы данных
- Вывод
- Особенности синхронизации в Android-приложении
- Особенности реализации синхронизации с помощью SyncAdapter
- Как реализовать синхронизацию с помощью SyncAdapter‘а
- Выводы
Как настроить базу данных с Firebase Firestore для Android
Jun 6, 2020 · 7 min read
Начало
Загрузите стартовый проект с GitHub.
Откройте приложение в Android Studio и дайте завершиться Gradle sync. Запустите приложение и вы увидите список покупок:
Создание проекта в Firebase Console
Первый шаг — это создание Firebase Console Project. Перейдите на главную страницу консоли Firebase. На этом экране вы увидите один из двух вариантов:
- Если вы никогда раньше не использовали Firebase Console, вам будет предложено ввести приветственное сообщение и приглашение создать проект.
2. Если у вас есть другие проекты, вы увидите их список и белую карточку для добавления проекта.
Нажмите кнопку, чтобы создать проект в зависимости от выбранного варианта. На первом экране вам будет предложено ввести название проекта. В этом случае вы будете использовать то же имя вашего Android приложения, которое называется MyShoppingList.
Нажм и те кнопку Continue и на следующем шаге вам будет предложено включить Google Analytics, но это необязательно:
Нажмите кнопку Create project и вы увидите загрузочный экран (рис.6). Загрузка займет немного времени.
Как только процесс будет завершен, иконка загрузки превратится в три оранжевые точки с текстом подтверждения и появится кнопка Continue.
Нажмите на кнопку Continue и вы попадете на главный экран проекта MyShoppingList.
Важно понимать, что этот проект будет работать для многих платформ — не только для Android. Если бы вы собирались интегрировать Firestore в приложение iOS или веб-проект, вы бы использовали тот же самый проект, и вы бы так же могли совместно использовать базу данных на разных платформах.
Добавление Firebase в приложение Android
Начиная с этой части, конфигурация рассчитана только для Android. На главном экране проекта нажмите на маленький белый значок Android, чтобы запустить процесс интеграции.
В качестве первого шага Firebase запросит данные вашего приложения. Добавьте следующее:
- Имя пакета: com.evanamargain.android.myshoppinglist . Это должно быть то же самое имя пакета, что и у вас в приложении. Если вы не уверены и не используете демо-проект, перейдите в app > manifests > AndroidManifest.xml. Пакет будет находиться в первых нескольких строках файла.
- Никнейм: My Shopping List. Это может быть любое название, которое поможет вам запомнить название приложения. Возможно, вы захотите добавить слово “Android”, если хотите отличить его от другого приложения.
- Сертификат SHA-1: он может быть пустым, так как он не пригодится в этом уроке.
После ввода данных вы получите JSON-файл google-services.json . На экране есть инструкции по его интеграции в приложение, но я объясню ниже, если это не совсем понятно.
Перейдите в Android Studio, где у вас открыт проект, и переключите вид на левой панели. Ваш проект, скорее всего, будет находиться в режиме “Android”, и вы получите выпадающее меню с опциями просмотра, как на рисунке 12 ниже:
Выберите Project и увидите дерево файлов, отображаемое так же, как на рисунке ниже. Загрузите файл из консоли Firebase в любое место вашего компьютера, а затем перетащите его в MyShoppingList > app.
Затем снова переключитесь на вид Android на левой панели. Большую часть времени вы будете использовать проекты Android в этом режиме, так как это самый простой способ навигации во время написания кода.
Как только вы доберетесь до представления Android, откройте Gradle Scripts > build.gradle (Project: MyShoppingList . Добавьте этот код:
В той же папке откройте Build.gradle (Module: app) и добавьте следующий код:
Если вы сомневаетесь, произошла ли синхронизация, взгляните на нижнюю панель. Она должна выглядеть так, как показано на рисунке 16 ниже:
Завершение настройки Firebase Console
Затем вернитесь в Firebase Console и нажмите кнопку Next, чтобы подтвердить добавление файла JSON и зависимостей в проект. В нижней части экрана появится заметка, указывающая на то, что Firebase проверяет подключение между вашим приложением и консолью. Соберите и запустите приложение. Оно должно работать и выглядеть также, как и в начале урока. После этого Firebase должен подтвердить подключение и отобразить кнопку Continue to console.
Если вышеприведенный шаг не удался, вернитесь к инструкциям и убедитесь, что вы все сделали правильно. Если все прошло успешно, на главном экране проекта вы увидите фиолетовую иконку с логотипом Android фиолетового цвета, что означает, что ваш проект подключен к приложению.
Настройка Firestore в Firebase Console
После добавления проекта в Firebase Console и подключения к нему приложения, пришло время настроить базу данных Firestore в консоли. Найдите большую оранжевую кнопку под главным экраном проекта, которая выглядит, как изображение 19 ниже:
Вы получите доступ к странице проекта Firestore и получите приглашение создать Database в виде большого баннера:
Нажмите на кнопку Create database для вывода модального экрана. Сначала он спросит вас о безопасности базы данных. Для разработки и этого урока установите его в “test mode“, но учтите, что для рабочего приложения важно включить “production mode“ для безопасности данных ваших пользователей.
Нажмите кнопку Next, и вам будет предложено указать местоположение сервера. Обычно рекомендуется выбирать наиболее близкое к вам или вашим пользователям место, так как это позволит сократить время загрузки. Консоль Firebase предлагает оптимальный вариант.
Как только вы нажмете на Done, вы увидите загрузку Provisioning Cloud Firestore. Подготовка может занять до трех минут, если сервис слишком загружен, но обычно это занимает меньше времени.
Настройка базы данных
После завершения процесса подготовки вы увидите свою базу данных, как показано на рисунке ниже. База данных пуста и ждет начала работы:
Нажмите на текст “+ start collection”, чтобы создать свою первую коллекцию. База данных имеет многоколоночную структуру, основанную на collections > documents > fields. Согласно демо-приложению, наша коллекция называется MyGroceries, так как в ней будут содержаться все наши наименования продуктов.
Затем для документа вам также будет предложено ввести имя. Это может быть “TodaysGroceries” или дата (например, “March30–2020”), если вы хотите иметь несколько списков в своем приложении.
Добавьте поля с образцами данных:
- Item1 = string — banana
- Item2 =string — peanut butter
- Item3 = string — bread
- …
Добавьте сколько хотите или просто скопируйте данные из нашего приложения.
После того как вы добавили все поля, ваша база данных должна выглядеть так, как показано на рисунке 27 ниже:
Вывод
Теперь у нас есть консоль Firebase и приложение для Android, настроенное на использование Firestore с базой данных.
Источник
Особенности синхронизации в Android-приложении
При разработке многих Android-приложений требуется организовать процесс синхронизации данных с данными на сервере. Есть два основных способа как данную синхронизацию можно реализовать.
Первый способ — классический (наиболее популярный и наиболее простой) — с помощью AlarmManager и Service. Например, как описано в этой статье.
Второй способ — «правильный» (но пока что, видимо, редко кем используемый) — с помощью SyncAdapter.
Разрабатывая своё приложение, изначально я попытался реализовать «правильный» (т.е. второй способ).
О том, как его реализовать — чуть ниже. Расскажу сначала о том, с какими сложностями и особенностями я столкнулся при его реализации.
Особенности реализации синхронизации с помощью SyncAdapter
Прежде всего — данный метод достаточно плохо описан в документации. Хотя на сайте разработчиков Android и есть пример реализации, более хорошим примером (с пояснениями) будет статья по этой ссылке.
Для работы данного способа синхронизации необходимо создание отдельного типа эккаунта специально для Вашего предложения (если существующие эккаунты, например, эккаунты Google не подходят), а это — тема для отдельной статьи (пример можно посмотреть, например, тут).
Данный эккаунт будет доступен в разделе Settings / Accounts & Sync. Создание (и удаление) эккаунта будет возможным не только из Вашего приложения, но и из этого раздела. В нем можно создать несколько эккаунтов для Вашего приложения (нужно ли это Вашему приложению?). Для каждого эккаунта нужно имя (для OAuth-эккаунтов приходится использовать выдуманные имена).
При этом неправильно написанный код эккаунта перезагружает как устройство, так и эмулятор — тестировать сложно. При этом, если Вы создали лишь код, отвечающий за эккаунт, и хотите его протестировать, то не выйдет — без полностью написанного кода SyncAdapter‘a устройство будет перезагружаться при входе в Accounts & Sync.
Как быть если Вашему процессу синхронизации не нужен эккаунт? Придется создавать dummy-эккаунт.
Если Ваше приложение будет синхронизировать данные с существующими базами — контактами телефона, событиями календаря или, например, фотографиями, то тут все проще (и большинство примеров в сети именно про такой тип синхронизации). Если же синхронизация будет производиться со своими данными, то необходимо, чтоб был создан свой ContentProvider.
Как быть, если Ваше приложение не хочет делиться своей базой с другими приложениями? Придется создавать dummy-ContentProvider, например, такой.
Если все сделано, и даже свой SyncAdapter написан (см. ниже как), то теперь синхронизация будет автоматически запускаться когда изменились данные в локальной базе.
Если синхронизацию нужно запустить вручную, то для этого есть функция requestSync(), ниже будет написано об ограничениях функции. Если нужно запускать синхронизацию автоматически, то для этого есть другая функция — addPeriodicSync(). Хотя работает она лишь на Android 2.2 или выше. Но работает данная функция отлично — например, если в момент синхронизации нет интернет-соединения, то синхронизация произойдет автоматически в тот момент, когда оно появится.
Как реализовать синхронизацию с помощью SyncAdapter‘а
Что же требуется сделать для реализации синхронизации с помощью SyncAdapter? (перевод ответа c StackOverflow)
1. Уведомить Android, что приложение поддерживает синхронизацию
Для этого в AndroidManifest.xml необходимо указать сервис синхронизации:
где name — имя, соответствующее имени класса для синхронизации (об этом — чуть ниже); exported — делает сервис доступным другим компонентам (в т.ч. и ContentResolver, который используется для взаимодействия с сервисом синхронизации); intent-filter позволяет перехватывать событие, требующее синхронизацию (возникает, например, когда синхронизация запрошена функцией RequestSync() Вашего ContentResolver‘a).
2. Создать сервис (службу) для нахождения SyncAdapter‘a
Ваш класс должен расширять Service, в нем должна быть переменная экземпляра AbstractThreadedSyncAdapter. Он должен реализовывать public IBinder onBind(Intent) и должен возвращать SyncAdapterBinder.
Достаточно многое должно быть реализовано в этом классе, т.к. данный сервис предоставляет стандартный интерфейс для SyncAdapter Android’a.
3. Создать класс SyncAdapter для непосредственного осуществления синхронизации
mySyncAdapter — место, где содержится сама логика синхронизации. Когда приходит время синхронизации, вызывается onPerformSync().
4. Осуществить связывание (binding) между типом эккаунта и Content Authority
В пункте 1, в файле AndroidManifest.xml, в поле name мы указали значение, которую и образует связь между ContentAuthority и эккаунтом. AndroidManifest.xml ссылается на другой xml-файл. В нашем примере это sync_myapp.xml:
Данный файл сообщает Android’у, что созданный нами SyncAdapter будет синхронизировать контакты.
Все значения строк в contentAuthority должны совпадать со значениями того, с чем будет происходить синхронизация. Если синхронизация будет происходить с Вашей собственной базой, то с Вашим значением. Если с какими-либо существующими базами (например, с контактами или событиями календаря), то со стандартными значениями. Например, указанное выше значение «com.android.contacts» идентифицирует стандартные контакты.
Значение accountType также должно совпадать либо с Вашим значением, либо со стандартным значением. Если Вы создаете свой собственный тип эккаунта, то Вам потребуется создать и подкласс AccountAuthenticator, чтобы осуществлять авторизацию на Вашем сервере (см. уже указанную выше статью). Указанное в нашем примере значение «com.google» идентифицирует, что мы используем Google-эккаунт.
5. Включение синхронизации для созданной пары Account—ContentAuthority
Наконец, можно включить процесс синхронизации. Это можно сделать либо в разделе Settings / Accounts & Sync, либо программно в Вашем приложении:
Для осуществления синхронизации она должна быть разрешена не только для Вашего приложения — необходимо глобальное разрешение на синхронизацию (в разделе Settings / Accounts & Sync должна быть проставлена соответствующая галка).
Если одно из этих условий не выполнено, то вызов RequestSync() ни к чему немедленно не приведет, запрошенная синхронизация однако будет выполнена позднее — как только синхронизация будет включена. Хотя, существует способ это обойти.
Дополнительно, можно включить периодические автоматические синхронизации.
Выводы
И так, чем же хороша (+) и плоха (-) синхронизация с помощью SyncAdapter по сравнению с ASyncTask?
(+) следование стандартам (Ваше приложение в списке всех синхронизирующихся приложений)
(+) поддержка нескольких эккаунтов
(+) простота реализации автоматических синхронизаций (когда остальное все уже написано)
(+) автоматическая синхронизация при появлении интернет-соединения
(+) удобство в синхронизации со стандартными базами (контакты, календарь и т.п.)
(-) необходимость создания эккаунта
(-) отсутствие полноценной документации
(-) сложность реализации и тестирования
(-) необходимость в Android 2.2 и выше для автоматических периодических синхронизаций
(-) необходимость создания своего ContentProvider’a
Итого, я выбрал ASyncTask для синхронизации в своем приложении (хотя код для SyncAdapter был уже почти полностью написан) — прежде всего, не хотелось ограничиваться версией 2.2 Android.
Источник