Programming Pursday – Die große weite Android-Welt

Tja, aus meinem Vorsatz jede Woche einen Blogpost zu schreiben ist mal wieder nichts geworden. Dennoch habe ich mich viel mit Android beschäftigt. Nach der ersten lauffähigen Demo von Routineer, die zugegebenermaßen bisher nur daraus bestand eine Aufgabenliste anzuzeigen und neue Aufgaben in einer Datenbank abzulegen, habe ich gemerkt, dass man an das Thema wohl doch besser nicht so blauäugig rangeht. Vor allem die Speicherung in der Datenbank hat einen enormen Overhead, woraufhin ich mich erstmal mit Alternativen beschäftigen wollte. Mein ursprünglicher Plan sah vor, möglichst eine lokale Datenhaltung zu haben und diese, bei Bedarf mit „der Cloud“ zu synchronisieren. Das ist aber gar nichtmal so trivial, wie man auf Anhieb mal denken möchte.

Deswegen werde ich mich in einem ersten Schritt wohl erstmal darauf beschränken, eine offline Version zu bauen, die aber so ausgelegt sein soll, dass das Speichermodell erweitert oder ausgetauscht werden kann. D.h. erstmal lokal in einer Datenbank, später dann vielleicht online-only um über die Cloud eine Bearbeitung auf mehreren Geräten / von mehreren Benutzern zu ermöglichen.

Aber auch die lokale Datenhaltung will optimiert werden, da mein bisheriger Weg, mit einer Datenbank-Helper-Klasse und eigenmächtigen Datenbankbefehlen (also quasi der Android-Standardweg), sich als recht umständlich erwiesen hat. Die Alternative lautet ORM – Object Relational Mapping. Dies ist ein Architekturpattern, das den Zugriff auf die Datenbanken kapselt und in diesem Falle die Persistierung der POJOs (Plain old Java objects), die ich sowieso anlegen muss, in der Datenbank übernimmt. Simpel gesagt, die Java-Objekte, die ich habe, werden im Hintergrund in die Datenbank geschrieben.

Dabei habe ich mir vor allem greenDAO und Active Android angesehen. Letzteres vor allem, da es auch einige Blogbeiträge gibt, die das Zusammenspiel mit retrofit behandeln. Das wird wohl dann später mein Framework werden um die Cloud-Anbindung zu realisieren. Im Grunde dasselbe Prinzip, Java-Objekte werden an einen Webservice geschickt.

Weiterhin hab ich mich auch noch mit den verschiedenen UI-Elementen auseinandergesetzt. Vor allem damit, die Liste der Aufgaben anzuzeigen. Auch nicht trivial. Da ich mit einer eigenen Datenbankanbindung angefangen hab, war auch der einfachste Weg der Anzeige daraus einen Cursor in eine ListView einzubinden. Das ist aber auch schon längst veraltete Technik, heutzutage benutzt man eine RecyclerView. Die hat aber keinen CursorAdapter, der sich so einfach aus einer Datenbank ziehen lässt. Und dazu gibt es auch noch keine einfachen Tutorials, sondern nur, sagen wir mal, Ansätze und Workarounds, die aber nicht sonderlich performant sein sollen. Mit dem ORM-Ansatz sollte aber auch dieses Problem in den Griff zu bekommen sein, da ich mich nur noch um die Java-Objekte und nicht noch deren Verwaltung in der Datenbank kümmern muss.

Zu guter Letzt ist dann doch noch ein wenig Konzeptarbeit gefragt, womit ich mich derzeit auch immer mal wieder auseinander setze. Das heißt vor allem, wie müssen meine Objekte aussehen, damit ich sie optimal abfragen, sortieren und speichern kann. Aber auch wie ist der App-Workflow und die UI-Gestaltung.

Also, wenn man es gleich richtig machen will ist halt doch etwas mehr Zeit und Vorarbeit notwendig, aber ich hoffe, dass ich nach Weihnachten dann mit der Theorie einigermaßen abgeschlossen habe und dann mit der weiteren Umsetzung fortfahren kann.