[Android] synchronizacja danych kiedy jest dostęp do internetu

0

Potrzebuję przechowywać w aplikacji android ilość wywołań konkretnej funkcji na telefonie, oraz wysyłać tę wartość w momencie, kiedy będę miał połączenie internetowe.
Jak to najlepiej zrobić? Czy jakaś lokalna baza androidowa i w momencie wykrycia połączenia update?
Czy może da się zrobić to jakoś łatwiej?

0

Łatwiej się nie da. Bazy danych do tego nie potrzebujesz. Jeżeli licznik musi przetrwać śmierć procesu to najłatwiej to zrobić na SharedPreferences. W przeciwnym wypadku może być zwykły int czy tam AtomicInteger trzymany w pamięci RAM. Samo rozwiązanie zależy też od tego czy wspomniana funkcja jest wywoływana tylko z jednego wątku (ewentualnie czy jest synchroniczna).

0

Doczytałem teraz że da się zrobić to na Firebase. Trzyma bazę lokalnie natomiast updatuje automatycznie wtedy kiedy ma połączenie z netem.

0

Jeżeli już korzystasz z Firebase to tak byłoby najlepiej. Od tego on jest m. in. Jeżeli nie korzystasz, to Firebase byłby tutaj zaciąganiem armaty do zabicia muchy.

0

Korzystam.
Potrzebuję do jednej bazy Firebase wysyłać z kilku różnych urządzeń informację o ilości wywołań funkcji (tak, żeby w Firebase znajdowała się suma)
Czy FIrebase wspiera to w jakiś prosty sposób? Czymuszę to jakoś oprogramować, typu, że jak aktualnie inne urządzenie aktualizujue bazę, to kolejne musi czekać w kolejce do transakcji itp.?

0

Ogólnie będę używał również tego:
https://firebase.google.com/docs/database/android/offline-capabilities bo nie zawsze będę online.
Czy jest coś o czym należy pamiętać, wrócić na coś szczególnego uwagę/zaimplementować przy takim rozwiązaniu?
Czy w takim razie transakcję muszę implementować jakoś na bazie offline?

0

Masz to przecież napisane w linku, który podałeś. W przypadku korzystania z bazy offline transakcje będą kolejkowane, ale nie będą trwałe jeżeli w międzyczasie nastąpi restart aplikacji. Autorzy dokumentacji sugerują zapisywanie lokalnie danych, a następnie ponowienie ich wysłania po restarcie aplikacji i odzyskaniu połączenia z Internetem.

0

Wygląda na to, że Firestore już tego nie wymaga: https://firebase.google.com/docs/firestore/manage-data/enable-offline - zarządza wszystkim sam, tzn. sam zapisuje lokalnie.

0

Zapisuje lokalnie, natomiast nie wiem jak rozegrać sprawę, gdyż kilka urządzeń będzie dodawało, wartość do bazy głównej. Co jeśli jedna baza lokalna będzie miała wartość 10, druga lokalna 20, trzecia 30 a w bazie głównej będzie już wartość np. 5. Ma ktoś jakiś sposób jak to oprogramować, żeby nic mi nie uciekło?

0

Najprościej zapisuj ilość dla każdego urządzenia osobno, a następnie sumuj sobie dopiero na serwerze.

0

Firebase umożliwia po stronie serwera implementacje np. Sumy pól? Czy z poziomu androida to muszę zrobić?

0

W konsoli firebase możesz sobie napisać zapytanie i zsumować. Chyba, że chcesz tę sumę np. przechowywać z datą albo gdzieś wyświetlać wtedy użyj po prostu cloud functions, sumuj i zapisuj.

0

Potrzebuje to zapisywać do statystyk. To tak zrobię.
Co do oddzielnej bazy dla każdego urządzenia - muszę je w jakiś sposób identyfikować. Nie za bardzo wiem w jaki sposób do ilości dodawać identyfikator, tak, żeby kolejne wartości robiły coś na zasadzie PUT dla danego device.

0

Najprościej? Zapamiętuj ilość wywołań u siebie na urządzeniu np. w pliku, w bazie danych albo w shared preferences. Następnie zawsze jak połączysz się z Internetem wysyłaj Settings.Secure.ANDROID_ID oraz ilość, którą masz zapamiętaną lokalnie. Jeżeli już masz w bazie te urządzenie to nadpisz ilość.

0

@Haskell: dzięki za pomoc.
Rozstrzygnąłem to tak, że każda funkcja dodaje nową wartość 1 do Firebase.
Następnie pobieram sobie to do GoogleScript, sumuje i wrzucam do GoogleSheets.

Temat do zamknięcia, może komuś się przyda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1