Редактировать
Существует нет собственный / стандартный / стандартный механизм синхронизации для синхронизации c данных в режиме реального времени на Android
Хотя есть суррогаты.
В контексте Android появляются две основные опции:
Сокеты с некоторым постоянным хранилищем - вы можете реализовать внутренний сервер с поддержкой сокетов и добавьте эту поддержку для вашего приложения android (ios / web / desktop). Это наиболее распространенный и довольно низкоуровневый механизм для реализации синхронизации c в реальном времени между устройствами. Плюсы : универсальный для разных платформ, отраслевой стандарт, много информации в Интернете. Минусы : поскольку это относительно низкоуровневая вещь, требуется много кода, она может быть довольно сложной и сложной, если имеется много синхронизаций c, требуется бэкэнд, требуется отдельное сохранение. Основные реализации: Socket.io
Firebase База данных реального времени / Cloud Firestore - в основном обертка вокруг сокетов в сочетании с некоторая база данных. «Плюсы»: не требует ни бэкенда, ни базы данных, бесплатна для прототипов / приложений с низкой нагрузкой, довольно прямолинейная реализация, кроссплатформенность, работает довольно хорошо. Минусы : много шаблонов, если вы хотите go «чистым способом», у вас нет контроля над внутренними процессами, не очень очевидный расчет платежей при высоких нагрузках, вы связываете себя с сторонним бэкэндом с указанным c API - требуется четко определенная архитектура, если вы хотите переместиться из нее куда-то еще без полной переделки приложения. сравнение: Firebase Cloud Firestore против базы данных реального времени
Я не буду вдаваться в подробности с реализацией, потому что официальная документация довольно проста в этом случае (в отличие от Google Drive )
Cloud Firestore
документация
Realtime Database
документация
Редактировать конец
Да. Есть возможность хранить данные в частном порядке, используя Google Drive
. Это будет доступно только вашему приложению. Более того, он не займет места у пользователей Google Drive
, что довольно удобно. Кроссплатформенность в этом случае возможна, но она должна быть реализована отдельно для iOs и Android (не поддерживается SDK из коробки).
Таким образом, решение основано на Google Drive API и, более конкретно, на Хранить специфику приложения c данные часть.
Единственным видимым для пользователя действием по этому поводу будет приглашение входа в систему Google.
Здесь - подробный быстрый запуск для Java
. Для этого вам потребуется:
Добавить зависимости;
Реализовать Google Auth, как описано здесь и здесь
Очень важно Аутентифицируйте пользователей с помощью drive.appdata
и drive.file
областей. Также включите Google Drive API в консоли Google Cloud. Все это описано здесь
Выясните, где ваш файл Room SQLite
расположен так: String currentDBPath = context.getDatabasePath("your_database_name.db").getAbsolutePath();
Загрузите файл в папку приложения Google Drive, как описано здесь
В основном это будет выглядеть так
Включить Google Dive API в консоли
Добавить зависимости (возможно, необходимо обновить до соответствующих версий)
implementation 'com.google.android.gms:play-services-auth:17.0.0'// for google sign in
// for drive integration
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'com.google.http-client:google-http-client-gson:1.26.0'
implementation('com.google.api-client:google-api-client-android:1.26.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0')
{
exclude group: 'org.apache.httpcomponents'
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/ASL2.0'
}
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- Google auth с необходимыми областями действия
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(
Scope(Scopes.DRIVE_FILE),
Scope(Scopes.DRIVE_APPFOLDER)
)
.requestEmail()
.build()
googleSingInClient = GoogleSignIn.getClient(this, gso)
val signInIntent = googleSingInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
... // handle sign in result
- Настройка службы клиента Google Drive (где контекст)
val mAccount = GoogleSignIn.getLastSignedInAccount(this)
val credential =
GoogleAccountCredential.usingOAuth2(
applicationContext, Collections.singleton(Scopes.DRIVE_FILE)
)
credential.setSelectedAccount(mAccount.getAccount())
val googleDriveService =
Drive.Builder(
AndroidHttp.newCompatibleTransport(),
GsonFactory(),
credential
)
.setApplicationName("Your app name")
.build()
- Создание и отправка файла
val fileMetadata = File()
fileMetadata.setName("your_database_name.db")
fileMetadata.setParents(Collections.singletonList("appDataFolder"))
val databasePath = context.getDatabasePath("your_database_name.db").absolutePath
val filePath = File(databasePath)
val mediaContent = FileContent("application/sqlite", filePath)
val file = driveService.files().create(fileMetadata, mediaContent)
.setFields("id")
.execute()
- Поиск файла на другом устройстве
val files = driveService.files().list()
.setSpaces("appDataFolder")
.setFields("nextPageToken, files(id, name)")
.setPageSize(10)
.execute()
for (file in files.getFiles()) {
// get file here
}
Чуть больше информации вы можете получить здесь
Надеюсь, это поможет.