Android: Как синхронизировать c данные приложения, хранящиеся в базе данных Room, между устройствами одного и того же пользователя? - PullRequest
2 голосов
/ 11 апреля 2020

Я работаю над приложением, которое хранит данные пользователя локально. Я использовал базу данных Room для хранения пользовательских данных на устройстве Android. Теперь, если у пользователя более одного устройства, данные должны быть доступны на всех его (Android) устройствах без какой-либо центральной базы данных или веб-служб.

Примечание: для стороны iOS я использовал CloudKit для синхронизации c данных между iOS устройствами. Есть ли способ сделать то же самое для Android устройств? Обратите внимание, что я не хочу хранить данные в какой-либо центральной базе данных, веб-сервере или центральном облачном хранилище. Он должен принадлежать только пользователю. (т.е. это должно быть синхронизировано через учетную запись Google пользователя). Примечание: я хочу собственное решение android и кросс-платформенный (Android до iOS) syn c не требуется.

Обновление: До сих пор я нашел несколько опций, таких как Firestore и База данных реального времени , а некоторые AWS службы также предоставляют возможность syn c, но проблема во всех них заключается в том, что они все хранят пользовательские данные в центральном облачном хранилище.

Таким образом, мой вопрос остается прежним - существует ли способ синхронизации c данных между android устройствами с использованием Google Drive или что-то подобное, где мы можем использовать пользователя собственное облачное хранилище вместо хранения пользовательских данных в центральной базе данных.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2020

Редактировать

Существует нет собственный / стандартный / стандартный механизм синхронизации для синхронизации 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'
} 
  • В android тег gradle
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 
        }

Чуть больше информации вы можете получить здесь

Надеюсь, это поможет.

0 голосов
/ 20 апреля 2020

Вы можете использовать Cloud FireStore от Firebase для этого https://firebase.google.com/docs/firestore

Это скаляб, и Google Drive API устарел. Я лично использовал FireStore для одного из приложений, и оно работает довольно хорошо. Бхарат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...