Meine App-Daten zu Google Drive sichern bzw. synchronisieren

  • Antworten:24
jimbo2
  • Forum-Beiträge: 33

03.09.2018, 18:26:45 via Website

Hallo,

ich bin nicht der große Entwickler aber ich arbeite mich langsam ran :). Ich hab eine kleine App deren Daten ich aktuell auf das Handy selbst exportieren lasse. Nun suche ich einen einfachen Ansatz meine Daten auf Google Drive sichern bzw. zu synchronisieren. Es geht dabei um ein .json File und verschiedene Daten die in der App als Anhänge gespeichert werden können. Eben so das ich die Daten auch auf einem anderen Gerät (z.B. Tablet) verwenden kann. Ich hab schon mal etwas geschaut aber irgendwie kommt mir das alles recht kompliziert vor. Gibt es da nicht einen einfachen bzw. fertigen Ansatz von Google? Andere Apps lösen, so wie es ausschaut, doch auch recht einfach. Also alle Daten zu Drive und dort in einem Ordner ablegen. Wenn es zu Synchronisierungsfehlern kommt macht das wie es ausschaut ja Drive von alleine. Also eine weitere Version anlegen etc...

Wäre euch echt dankbar für ein paar Denkanstöße.

Gruß

— geändert am 03.09.2018, 18:54:41

Kommentieren
swa00
  • Forum-Beiträge: 3.704

03.09.2018, 18:30:42 via Website

Hallo derGü,

hier ist alles , was Dein Herz begehrt

https://developers.google.com/drive/android/get-started

EInfacher geht es nicht , es sei denn , du suchst Dir eine Library.
Allerdings kommst du auch da nicht um die Sicherheits-relevanten Dinge nicht drumrum

Macht also keinen Sinn, da der Aufwand gleichzusetzen ist

— geändert am 03.09.2018, 18:33:24

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

03.09.2018, 18:43:29 via Website

Hmm... Storing app data hatte ich auch schon gesehen. Das war ja was für mich etwas kompliziert ausschaute :). Aber wenn es nur so geht muss ich mich wohl damit auseinandersetzen. Hab ich auf dem Weg denn auf die Synchronisierung Einfluss? Ich möchte in meiner App ja bestimmen können wann er synchronisieren soll. Und wie machen das denn andere Apps wo ich in meinem Drive einfach einen sichtbaren Ordner der App habe?

Hast du vielleicht ne Empfehlung für ne gute Library?

Ich suche halt irgendwas das mir die ganze Synchronisierung abnimmt.

— geändert am 03.09.2018, 18:50:24

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

03.09.2018, 18:51:49 via Website

Ich suche halt irgendwas das mir die ganze Synchronisierung abnimmt.

So etwas mache ich zu Fuss, damit ich auch weis , wann wo und wieso passieren soll .
Sorry - eine Library verwende ich nicht - schau mal auf Github

— geändert am 05.09.2018, 12:28:40

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
jimbo2
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.09.2018, 19:39:55 via App

Hallo DerGü,

Sollten die Appdaten nur aus Prefs bestehen könnte dir das hier Anhaltspunkte geben:
https://github.com/googlearchive/drive-appdatapreferences-android

— geändert am 03.09.2018, 19:40:06

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

03.09.2018, 21:45:26 via Website

Hey Leute,

danke! Ich schaue mir beides mal an und melde mich morgen wenn ich noch Fragen haben sollte. Aber schon mal danke für die schnelle und nette Hilfe. (cool)

— geändert am 03.09.2018, 21:51:20

Hilfreich?
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 12:04:27 via Website

Ich hätte noch eine ggf. oberflächlichen Gedanken.

Gibt es bei der Verwendung von Drive oder Dropbox nicht einen Ordner der automatisch seinen Inhalt synchronisiert, also so wie am PC? Wenn ich nun die lokalen Daten meiner App in einen solchen Ordner lege und direkt von dort auf die Daten zugreife, wäre das nicht ein einfacher Ansatz? Oder gibts sowas gar nicht?

Und noch eine andere Frage bitte. Was würde es mich ggf. kosten wenn man die Synchronisationsfunktionalität an einen fähigen Entwickler auslagern würde? Ist sowas sehr kostspielig?

— geändert am 05.09.2018, 12:06:54

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

05.09.2018, 12:13:41 via Website

Hallo

a) Nein , du musst das schon anstossen

b) "Wieviel kostet ein Auto ?" Diese Gegenfrage ist mit deiner Frage gleichzusetzen.

Es kommt darauf an , was du lieferst , was du benötigst, welchen Service du erwartest etc. etc.
In deinem laufenenden Projekt wird kaum einer was tun - allerhöchstens Dir eine Library stricken.
Dazu müsstest du aber auch erst mal eine Art Plichtenheft auf die Beine stellen .

an einen fähigen Entwickler auslagern

Die Stundenlöhne bei Entwicklern , die auch Praxiserfahrung haben und wissen was sie tun , liegen gut um die 100 Eus und aufwärts.

Deine Frage ist also pauschal nicht zu beantworten ...

— geändert am 05.09.2018, 12:25:27

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 14:23:12 via Website

Unterm Strich brauch ich eine Automatisierung die Inhalte in einem Ordner mit Google Drive synchronisiert. Also die reine Funktionalität. Damit ich aus meiner App eben dort die Daten reinlegen kann.

Aber ich versuche mich die Tage erstmal noch alleine. Kann ja so schwer nicht sein (thinking). Sollte ich nicht weiter kommen würde ich mich wegen dem Thema noch mal melden.

Super das hier Leute sind die einem auch mal antworten.

Nett von euch.

Hilfreich?
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 18:22:24 via Website

So hab mir das jetzt mal genau angeschaut. Wenn ich das richtig verstehe muss ich die Synchronisierung also für jede Datei einzeln machen und auch alle Eventualitäten beim fehlerhaftem Upload wegen Disconnects etc... abfangen. Reden wir mal nicht von der synchronen Nutzung auf zwei Geräten.

Also ich glaub das überscheidet meine Fähigkeiten bei weitem.

Was ich gefunden habe ist die Dropbox API v1 in der das ja wie es scheint deutlich leichter ging. Warum man sowas nun auslaufen lässt verstehe ich nicht. Alles was ich als einfachere Lösungen gefunden habe wird von aktuellen APIs irgendwie nicht mehr unterstützt. Warum ist das eigentlich so? Warum macht man einfache Dinge unnötig schwerer.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.09.2018, 18:56:23 via Website

Hallo es gibt doch einen Nachfolger v2.
Wenn du nicht gleichzeitig auf zwei Geräten arbeiten tust und sicher stellen kannst das nur ein Gerät eingeloggt ist sollte doch der Datei zeitstempel als sync kreterium reichen.

— geändert am 05.09.2018, 19:43:21

Hilfreich?
jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 19:03:07 via Website

Aber auch da muss ich das dann ja für jede Datei einzeln machen und eben wieder prüfen ob meine Dateien auch alle hochgeladen wurden. Also bevor ich meine App auf einem anderen Gerät öffne. Und wenn ich das dann mache und ändere auf Gerät 2 etwas kommt es ja wenn Gerät 1 wieder Internet hat zu einem Konflikt. Und so wie ich das gelesen habe lief das in der v1 anders.

Hilfreich?
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 19:35:09 via Website

Mein Problem ist es am ehesten das ich keine richtige Kontrolle über die Uploads und Downloads habe. Also so kleine Dateien (.json mit der Struktur) sind ja kein Problem. Aber bei den größeren Dateien wie Bilder und so komme ich nicht mit der Prüfung klar dass diese auch vollständig hochgeladen wurden und was zu tun ist wenn das eben nicht funktioniert hat. Manchmal bekomme ich das gar nicht mit. Das muss doch irgendwie einfacher gehen (thinking)

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.09.2018, 19:37:19 via Website

Um welche Art von Daten geht es denn?
Vielleicht ist eine online DB mit Live Update besser geeignet für dich?
Dafür brauchst du aber eine Dauerhafte Verbindung oder ein DB sync.
PS: Daten in Json lassen sich gut in DBs schreiben entweder in Objektorientierte DBs a la Firebase oder Relationale DBs a la MySql.

— geändert am 05.09.2018, 19:39:19

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
jimbo2Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.09.2018, 19:39:17 via Website

Gut mit der v1 und v2 hab3 ich mir nicht näher angesehen.

Aber warum muss es zu einen Konflikt kommen wenn du von Gerät 1 zu zwei gehst. Beim Start der app oder beim einloggen prüfst du die Zeit Stempel und die neueren lädst halt neu in deine app.
Kannst ja auch eine logg Datei in der cloud anlegen in der gespeichert wird welche Dateien verändert wurden auf dem ersten Gerät. Beim einloggen von Gerät zwei musst du sicher stellen das eins nicht mehr Online ist oder es einfach ausloggen.
Sonst wirst du sicherlich Konflikte haben.
Nach dem neu laden der Datein in deine app löschenden Inhalt der logg Datei.

Wenn es mehr als zwei Geräte sind ist der verwaltungs Aufwand etwas größer.
Und sicher auch etwas komplexer .
Denke dazu kann dir saw00 weitere Tipps geben.
Klar ist das viel Hand Arbeit ist aber doch auch mal interessant so etwas zu machen.

Auch wenn du eine lib benutzt musst du sicher stellen das deine Daten ströme geschlossen sind . Oder du musst immer synchron in deine app und in die cloud schreiben .

— geändert am 05.09.2018, 19:55:02

Hilfreich?
jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 20:41:12 via Website

Also DB ist keine Option. Möchte ja keine zusätzlichen Kosten oder so generieren wenn ich die App Freunden gebe wo ich ja nicht wissen kann was die da so alles ablegen. Die sollen dann mal fein ihren eigenen Drive oder die Dropbox füllen :).

Also das Json beinhaltet die Struktur inklusive Texte und so. Ist also sehr klein. Aber die weiteren Inhalte können auch schon mal 50 oder 100 MB groß sein. Sind halt große PDFs mit Bildern drin aber auch Audio oder kleine Video Files.

Das Json geht gut durch aber bei den größeren Sachen kommt es selbst im WLAN mitunter zu Abbrüchen beim Upload. Wie soll das dann erst im Datennetz sein wenn da mal n Funkloch kommt. Gibt hier ja zu genüge ;). Und einen solchen Fall muss ich dann ja irgendwie abfangen. Kann ich aber manchmal gar nicht weil ich es mitunter gar nicht mitbekomme. Und am Ende soll die App ja rund laufen.

Das ist aktuell mein größtest Problem.

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

05.09.2018, 20:50:14 via Website

Du könntest Dir natürlich noch deinen eigenen Überprüfungs-Mechanismus hinzufügen.
Und am Ende des Up/Downloades nochmal gegenchecken, z.b. MD5.

Wie schon oben erwähnt : Es gibt nicht die eierlegende Wollmilchsau - Vieles musst du selbst initiieren, abfangen und überprüfen.

Du wirst also nicht um eine ordentliche Entwicklung herum kommen und die Zeit investieren.
Das ist auch bei Libraries so, deshalb anfangs auch mein "Basis"- Link.

Bist du auf der Flucht, oder warum drängelt es dir so ? :-)

— geändert am 05.09.2018, 20:55:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

05.09.2018, 21:17:51 via Website

@swa00

Die Wollmilchsau ohne Eier würde mir auch schon reichen. Die Eier bekomme ich dann sicher hin. :)

Bin nicht auf der Flucht aber wenn ich mir was in den Kopf gesetzt habe will ich das auch durchziehen. Gerade wenn hier so nette Leute sind die mir ihre Erfahrungen mitteilen. (cool)

Ich verstehe halt nicht warum mir bei manchen Files die Uploads abbrechen. Ist auch total random wann und warum.

@Jokel

Ich werde sicher nicht verhindern können das wer anders die App auf zwei Geräten öffnet. Hab mir aber schon was überlegt was ich dann mache.

Mein Gedanke: Wenn ein User die App auf einem Gerät nutzt welches gerade kein Internet hat und er vor dem Upload sein Projekt (man kann mehrere "Projekte" in der App anlegen) auch auf einem anderen Gerät die alte Version des Projekts bearbeitet und dann beide hochgeladen werden gibts einen Konflikt der Json-Datei. Diese lasse ich dann beide mit je einem anderen Namen in der Cloud. Der User sieht dann beim nächsten laden zwei Projekte in der App. Das alte und das neue. Er kann dann entscheiden welches er behalten will und löscht das andere einfach. Die Anhänge bleiben davon ja unberührt da beide Projekte auf die gleichen Anhänge verweisen.

Das macht aber alles nur Sinn wenn ich die anderen Files auch gescheit transferiert bekomme.

Wer ne Idee wie ich das mit den Upload besser in den Griff bekomme? Stimmt es eigentlich das Android einfach Prozesse beenden kann wenn ihm danach ist? Also wenn zu viele Apps offen sind.

— geändert am 05.09.2018, 21:40:13

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.09.2018, 21:57:50 via Website

Hallo mal eine Frage wie machst du denn das mit dem upload? Eigene Methoden oder über eine lib wie okhttp zb.

Ja Android kann schon mal einen Service beenden. Meistens erfolgt das erst nach Ca 30 min. Solange wird wohl der upload nicht dauern.
Machst du den upload auch in einem eigenen thread ?

Wenn sich dein Service wirklich beenden sollte dann setze doch einen hardbeet drauf. Damit er nicht vom System beendet wird. Erfahrungs gemäß reicht da 30 min aus.

— geändert am 05.09.2018, 22:02:57

Hilfreich?
Kommentieren
jimbo2
  • Forum-Beiträge: 33

06.09.2018, 07:52:28 via Website

Also ich verwende aktuell REST-API (normaler XHR-Request) und nein die Uploads laufen nicht in einem eigenen Thread. Warum ist das sinnvoll?

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

06.09.2018, 07:58:50 via Website

und nein die Uploads laufen nicht in einem eigenen Thread. Warum ist das sinnvoll?

Threads sind das A&O unter Android ...
Hört sich so an , als würdest du alles "warten" lassen , bis der Upload erledigt ist - das geht schief .

Immer schön Threads bauen und am Ende mit Listener arbeiten.

Hinweis : Schau dir mal die Libraries an , da kommt keine ohne Thread und Listener aus.
Egal ob ION, OKHttp, Volley ....

— geändert am 06.09.2018, 08:00:43

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

06.09.2018, 11:28:52 via Website

Da haste schon Recht. Wird getestet.

Ich war mal etwas kreativ :D um mir zu überlegen wie ich die Struktur am besten abbilde. Also was wäre wenn etc...

image

Größere Anhänge habe ich mal zur Seite gelegt. Da teste ich mal eigene Threads für dei Uploads und ein paar libs.

Also gehen wir das mal durch
Unterm Strich habe ich also auf dem Handy, in der Cloud und auf dem Tablet die gleichen Daten. Wenn ich nun auf dem Handy etwas ändere (einen keinen Text welcher ja in der Json liegt) dann ist die lokale Version ja neuer als die in der Cloud womit die in der Cloud überschrieben werden würde. Schwierig wird es also wenn mein Handy gerade kein Netz hat (womit dann nicht synchronisiert werden kann) und ich dann am Tablet die "ältere" Version bearbeite. Mir fällt dabei gar nicht auf das die kleine Textänderung welche ich am Handy gemacht habe und welche ja nicht synchronisiert wurde nicht in der Tablet Version ist. Somit ist die Tablet Version ja nun neuer als die in der Cloud. Ergo wird die Cloud Version überschrieben. Wenn mein Handy nun aber nach diesem Prozess wieder Internet hat ist die Handy Version ja älter als die in der Cloud. Was nun?

Vielleicht sollte ich die Synchronisierung nur per Knopfdruck anbieten. Damit muss der User aktiv werden und bekommt wenn kein Netz da ist einen Fehler. So läuft er vielleicht weniger Gefahr wegen fehlendem Netz Änderungen von unterwegs wegen der oben beschriebenen Situation zu verlieren?

Noch eine andere Frage. Würdet ihr die Json Files immer komplett neu hochladen oder wäre es vielleicht besser nur Teile die in dem File geändert wurden (neuer Text) zu aktualisieren? Ein Json ist bei mir ein Projekt. Und man kann ja mehr als ein Projekt anlegen. Auf der einen Seite finde ich die Trennung gut weil ich so vielleicht bei einem Konflikt (Zeitstempel) eine weitere Json anlegen könnte die dann in meiner App als Projekt 1 (Konflikt) angezeigt wird. So sieht der User dann ja auch das es einen Fehler gab und kann sich bei beide Projekte anschauen und überlegen welches er behalten will.

Man das Thema ist schon recht wirr. :(

— geändert am 06.09.2018, 17:11:39

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

06.09.2018, 11:43:32 via Website

Wie cool ist das denn :-) - So eine Arbeit habe ich mir noch nie in meinem gesamten Guru leben gemacht.
Maximal in einem Programm - aber ausgeschnibbelt habe ich noch nie was :-)

So , dann vielleicht mal etwas für die Sprünge :

a) Bei Beiden Devices musst du erst mal feststellen , ob eine Verbindung besteht , Das kannste mit einen Netzwerk Listener. Dann kannst du auch die Synchronisation selbst durchführen, ohne Button.

b) Dann hast du genau das gleiche Problem , was alle haben - die Versionsunterschiede.
Das musst du selbst handeln , ob mit einem MD5 file , oder was extra mitschreibst , oder nach Datum und Uhrzeit .... darum kommst du nicht drumrum.

Der Erste malt zuerst , das ist immer so . Du kannst das Ganze auch noch verfeinern , indem du jeden Nutzer gesondert über die Benutzung des Files informierst und deren Bearbeitung sperrst.
(z.B. Pushs mit FCM) - Was ich empfehlen würde.

Zu b) Viel Spass beim "zerlegen" des Jsons und gegenchecken , welcher Teil denn relevant ist ... :-)
M.E. viel zu aufwendig .

— geändert am 06.09.2018, 11:44:53

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.jimbo2
Kommentieren
jimbo2
  • Forum-Beiträge: 33

06.09.2018, 12:10:46 via Website

Das Ausschneiden war sehr beruhigend. Kann ich nur empfehlen! :)

swa00

Das kannste mit einen Netzwerk Listener.

Der Netzwerk-Listener sagt mir ja nur ob ein Netz verfügbar ist. Aber ich kann ja in meiner App nicht alle 5 Minuten wo ich ggf. automatisch im Hintergrund synchronisieren will ihm eine Info anzeigen lassen das gerade kein Netz verfügbar ist. Oder synchronisiere ich lieber nur beim öffnen und schließen der App?

— geändert am 06.09.2018, 13:58:56

Hilfreich?
Kommentieren
jimbo2
  • Forum-Beiträge: 33

06.09.2018, 19:28:49 via Website

Eine letzte Frage zu dem Thema. Es geht um die optimale Dateistruktur. Aktuell habe ich das so.

Ordner: projekt-name-1
projekt-name-1.json

Ordner: projekt-name-2
projekt-name-2.json

Ordner: projekt-name-3
projekt-name-3.json

etc...

Im Ordner sind dann alle Anhänge und auch die kleinen Bilder für die Listen.

In einem anderen Forum meinte jemand das es wohl besser wäre die Projekte alle in eine Json zu hauen und die Anhänge aller Projekte in ein Verzeichnis zu legen. Also das wo auch die Json Datei drin liegt. Ohne Unterordner wäre wohl besser für den Speed bei vielen Projekten und alle Projekte in einer Map würde ja weniger Server Requests bedeuten wenn jemand nicht nur in einem Projekt etwas ändert. So muss er dann eben nur eine Datei hochladen und nicht 3,4,5 etc...

Ich kann mir aber irgendwie nicht vorstellen das irgendwelche IO Zugriffe auf aktuellen Geräten sich an ein paar Ordnern stören und das Google oder Dropbox nun keine Probleme mit mehr als "einer Anfrage" haben. Oder liege ich da falsch?

Wenn ich alle Projekte einzeln betrachte kann der User ja auch selbst entscheiden welches er in die Cloud legen will. Auf dem anderen weg muss ich ja immer alle Projekte synchronisieren....

Wie würdet ihr das machen? (thinking)

— geändert am 06.09.2018, 19:30:48

Hilfreich?
Kommentieren