Spinner als Kategorien

  • Antworten:15
Carmen Füßler
  • Forum-Beiträge: 7

30.06.2011, 08:54:22 via Website

Morgen,

ich sitze nun seit knappen 3 Wochen an einer Android App.
Habe mich schon vorher mit Java beschäftigt und bin nun bei den Apps angelangt.

Nun habe ich eine App, die mit einer externen Datenbank arbeitet (Connection per PhP-Script) und es auch schon hinbekommen, dass die App Daten aus der Datenbank ausliest und in einen Spinner einfügt.

Woran ich nun jedoch hängt und auch keinen Ansatz habe um richtig im Internet zu suchen, ist Folgendes:

Ich habe Spinner Nummer 1, in den ich aus der Datenbank Daten auslese und einfüge.
Momentan Betrieb 1 und Betrieb 2.

Nun möchte ich Spinner Nummer 2 in dem ich Standorte aufzeige und zur Auswahl stelle, aber nur noch diese, an denen es den ausgewählten Betrieb auch gibt. Der Rest soll nicht mehr ausgelesen werden und im Spinner auch nicht mehr eingetragen werden.

D.h. ich muss ja nun mit dem Wert arbeiten, den der Nutzer auswählt. Sprich mit der ID des Betriebes und diese dann mit den Standorten vergleichen, und filtern wo diese ID eingetragen ist.

Ich hoffe man versteht wo mein Problem liegt und kann mir helfen.

Danke schon einmal.

Antworten
Stefan S.
  • Forum-Beiträge: 560

30.06.2011, 14:09:28 via Website

Hallo Carmen und willkommen auf AndroidPIT!

Ich habe noch nie mit einem Spinner gearbeitet aber ich denke dort gibt es auch eine Methode onItemSelectionChanged oder so was ähnliches.
Dies musst du in Spinner 1 implementieren und jedesmal wenn das Item geändert hat musst du Spinner 2 anhand der gewählten ID in Spinner 1 ändern.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

30.06.2011, 23:51:40 via Website

Auch von mir ein Willkommen im Forum :)

An den Spinner1 hängst du via setOnItemSelectedListener() eine Funktion, die dir den Spinner2 entsprechend der aktuellen Auswahl neu befüllt.

Antworten
Carmen Füßler
  • Forum-Beiträge: 7

01.07.2011, 10:43:30 via Website

Danke für die nette Begrüßung.

Habe jetzt ein OnItemSelected hinzugefügt (Hier kommt es zu meiner ersten Frage, wie ich den Spinner als Standardwert komplett leer mache?) und wollte dort dann eine Abfrage starten, habe dann aber bemerkt, dass ich die Infos für die Standorte ja in einer anderen Tabelle liegen habe als die, für die Betriebe.

Mein PhP script sieht so aus:


$q=mysql_query("SELECT * FROM betriebe");
while($e=mysql_fetch_assoc($q))
$output[]=$e;

print(json_encode($output));

Kann ich hier nun einfach im gleichen noch aus der Tabelle standorte auslesen? Bin mit PhP und SQL leider nicht ganz so vertraut.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

01.07.2011, 11:10:29 via Website

Ich würde empfehlen, die Betriebs- und Standortdaten beim Start der App/Activity einmalig beim Server zu erfragen und die Spinner dann aus den lokalen Daten zu befüllen.

Dazu würdest du im Prinzip für die Standorte das gleiche machen wie jetzt für die Betriebe, die gelieferten Daten zB in 2 ArrayList sammeln und deine Spinner dann daraus befüllen.

Mit einem join könntest du die ganzen Daten auch mit einer Abfrage abholen, das würde dann etwa so aussehen:
select b.*, s.* from betriebe b left join standorte s on (b.bid=s.bid) order by b.bid
Allerdings würdest du damit natürlich viel mehr Datenvolumen erzeugen, weil pro Standort jeweils alle Betriebsdaten immer wieder geliefert werden.

Antworten
Stefan S.
  • Forum-Beiträge: 560

01.07.2011, 11:12:13 via Website

and dev
Ich würde empfehlen, die Betriebs- und Standortdaten beim Start der App/Activity einmalig beim Server zu erfragen und die Spinner dann aus den lokalen Daten zu befüllen.

Dazu würdest du im Prinzip für die Standorte das gleiche machen wie jetzt für die Betriebe, die gelieferten Daten zB in 2 ArrayList sammeln und deine Spinner dann daraus befüllen.

Mit einem join könntest du die ganzen Daten auch mit einer Abfrage abholen, das würde dann etwa so aussehen:
select b.*, s.* from betriebe b left join standorte s on (b.bid=s.bid) order by b.bid
Allerdings würdest du damit natürlich viel mehr Datenvolumen erzeugen, weil pro Standort jeweils alle Betriebsdaten immer wieder geliefert werden.

Wieso hier ein Left Join und kein Inner Join? Er möchte doch den Spinner 2 anhand der Auswahl des Spinner 1 laden?

Antworten
Carmen Füßler
  • Forum-Beiträge: 7

01.07.2011, 11:50:23 via Website

D.h. ich hole per PhP script alle Daten per JSON und der inner/left join abfrage und hätte damit aber jedesmal einen riesigen Datenaustausch?

Oder ist es theoretisch auch möglich, die externe Datenbank in die lokale Datenbank zu speichern? Habe dazu schon gesucht um dann in der App direkt mit den SQL Abfragen zu arbeiten statt mit dem PhP Script, aber noch nichts gefunden :(

Verstehe hoffentlich was ihr schreibt, aber muss sagen bin noch nicht so fit, dass ich das was ich nun vom Ablauf her verstanden habe, in Code umsetzen kann °.° irgendwie stehe ich noch aufn schlauch *blush*

Achja, Sie ;) nicht Er

Antworten
Stefan S.
  • Forum-Beiträge: 560

01.07.2011, 12:08:01 via Website

Carmen Füßler

Achja, Sie ;) nicht Er

Sorry für das... *Shame on me*... :wacko:

Du kannst dir natürlich eine eigene kleine DB auf dem Gerät anlegen und dieses beim erstmaligen Start abfüllen. Dann hättest du auch keine Traffic mehr, falls die Daten nicht dauernd ändern natürlich.
Von wievielen Daten sprechen wir denn überhaupt welche hin und her geschickt werden bei einem Item-Change?

Antworten
Carmen Füßler
  • Forum-Beiträge: 7

01.07.2011, 13:17:31 via Website

Sorry für das... *Shame on me*...
Ach macht nichts :D Sind bestimmt nicht viele Frauen die sich mit sowas beschäftigen ^^

Hmm das kommt drauf an ob die App dann in Serie geht.

Ist schon einiges. Geht um einen Betrieb mit knapp 400.000 Mitarbeiter weltweit :D

— geändert am 01.07.2011, 13:18:06

Antworten
Stefan S.
  • Forum-Beiträge: 560

01.07.2011, 14:54:29 via Website

Ja dann würde ich die Daten lokal in eine DB speichern.
Können die User Daten manipulieren?

Antworten
Carmen Füßler
  • Forum-Beiträge: 7

01.07.2011, 19:24:26 via Website

Nein die User sollen da gar nichts dran machn können ^^

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

01.07.2011, 19:39:02 via Website

Dann solltest du vielleicht eine Lösung in Betracht ziehen, bei der der Server die Daten in eine SQLite-Datenbank exportiert und diese Datei dann (für die App) zum Download anbietet.
So sind Daten-Aktualisierungen möglich, die App funktioniert aber trotzdem auch im Funkloch oder im Flieger.

Antworten
Carmen Füßler
  • Forum-Beiträge: 7

01.07.2011, 19:41:10 via Website

Ich habe dazu schon etwas gelesen, aber ich muss sagen, mich hat es ein wenig abgeschreckt, dass man dafür dann laut einiger Aussagen einen Konverter "entwerfen" muss o.O

Antworten
Stefan S.
  • Forum-Beiträge: 560

01.07.2011, 20:50:15 via Website

Carmen Füßler
Ich habe dazu schon etwas gelesen, aber ich muss sagen, mich hat es ein wenig abgeschreckt, dass man dafür dann laut einiger Aussagen einen Konverter "entwerfen" muss o.O
Was für einen Konverter?

Antworten
Carmen Füßler
  • Forum-Beiträge: 7

01.07.2011, 20:53:14 via Website

Hmm da heben welche geschrieben, dass man die mysql syntex erst "umwandel" muss bevor man mit sqlite arbeiten kann :/

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

02.07.2011, 00:33:01 via Website

Es wird sicher Unterschiede in den verwendeten Dialekten geben, aber nachdem du dich im MySql Dialekt nicht auskennst, sollte das keine Rolle spielen, dann lernst du halt SQLite statt MySql ;)

Mein erster Versuch wäre ein SQL-Dump der benötigten Tabellen mithilfe von zB MySqlAdmin, und ein anschließender Import dieser Datei mit zB SQLiteMan. Dann wird sich ja zeigen, ob/wo es Unterschiede gibt und ob/wie man die am einfachsten beheben kann.

Alternativ könnte man so einen Dump sicher auch mit einem PHP-Script selber erstellen, was den Vorteil hätte, das man a) nur die Daten exportiert, die in der App auch benötigt werden und b) das evtl. auftretende Dialekt-Problem vom Tisch ist.

Antworten