Spinner füllen von SQLite

  • Hallo Leute, ich habe mir gerade einen Spinner gebaut der aus einer SQLite Datenbank gefüllt wird. Auf den Dropdown Items sollen "Car_Marke" und "Car_Modell" angezeigt werden. Der folgende Code funktioniert soweit das mein Spinner mir die "Car_Marke" aber nicht das Modell anzeigt.
    Ich denke mein Fehler liegt irgendwo in Zeile 7 o. 8, nur ich finde ihn nicht.



    der Code meines getAllCars() dessen Ergebnis im Coursor ist sieht folgendermaßen aus.



    Es würde mich sehr freuen wenn ihr mir weiter helfen könnt. :D

  • also das Feld "text1" existiert in meinem Code gar nicht, das wurde glaub ich automatisch generiert oder so.
    ich hatte meinen Code schon so...

    Java
    int[] to = new int[]{android.R.id.text1, android.R.id.text2};


    aber dann wurde das Car_Modell trotzdem nicht angezeigt. Normalerweise verknüpfe ich in dieser "from"-"to" Geschichte Daten mit TextViews auf meiner "irgendwas.xml", so kenne ich das zumindest, aber auf meinem Spinner hab ich ja nie irgendwelche TextViews o.ä. angelegt. Darum verstehe ich nicht was ich nun dort eintragen muss damit beide Felder, Car_Marke und Car_Modell angezeigt werden.

  • Kann sein das es für Spinner ein fertiges 2-Zeilen Layout gibt, aber normalerweise kannst du dir das genau wie bei Listen ganz einfach selber machen/setzen.
    Solange du kein passendes Layout und damit eine funktionierende from - to Abbildung hast, kann das ganze halt nicht funktionieren.

  • das ist der Code des "android.R.layout.simple_spinner_dropdown_item"



    diesen habe ich kopiert und in einer eigenen XML datei eingefügt. sobald ich diese speichere spinnt meine IDE, und zwar wegen dieser Zeile --> android:layout_height="?android:attr/dropdownListPreferredItemHeight"
    Meine IDE wirft nun hunderte Fehler, an allen Stellen an denen ich "R.id...." oder "R.layout...." verwende. ich könnte alle Fehler weg machen wenn ich diese Verweise durch "com.example.meineApp.layout..." ersetze. Aber ich denke das ist wohl nicht sinn der Sache.


    ohne die oben genannte Zeile, passiert gar nix. Also weg mit ihr... nun sieht der Code so aus..


    nun passiert aber das selbe Spiel beim zweiten auftreten dieser Zeile -->
    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android


    Entschuldigt bitte so viele Codebeispiele aber ich versuche mein Problem möglichst deutlich darzustellen und wenige gegenfragen aufkommen zu lassen.
    Mir ist also in allem nicht bewusst wie ich in meiner eigenen XML Datei (custom_dropdown_item) eine zweite TextView bzw. CheckedTextView erstellen kann.


    falls es nicht allzu große Umstände macht würde ich mich über ein Code Beispiel sehr freuen :P


    Vielen Dank schon mal für eure Hilfe !!

  • Code ist immer gut, beschränkt die Interpretationsmöglichkeiten und sorgt somit für effizientere Kommunikation.


    Was dir offenbar fehlt ist Grundwissen zu Layouts, vielleicht solltest du da noch nachbessern :)


    In deinem konkreten Beispiel:
    1. "xmlns:android" gehört lediglich ins root element des Layouts, da hier der Namespace definiert wird
    2. ein Layout benötigt ein root Element, in dem du deine childs dann unterbringst, deinem Beispiel fehlt ein solches


    Wenn du den Code nur kopierst, ohne ihn zu verstehen, dann ist natürlich klar das du auftretende Fehler nicht finden kannst :P
    Nicht falsch verstehen: kopieren ist gut, aber eben nur solange man weiß was man tut (oder es nach ausgiebiger Analyse des Kopierten weiß)



    Ausgehend von deinem letzten Beispiel wäre die funktionierende Lösung etwa:
    <linearLayout orientation vertical xmlns=...>
    <textview id text1 singleline>
    <textview id text2 singleline>
    </linearlayout>

  • Oh man bin ich dämlich, ist ja klar... ^^ Dachte nur des wäre irgendwie so ein Sonderfall indem man kein Layout braucht weil von anfang an keins da war, und ich dachte das braucht man immer, aber anscheinend nicht wenn man nur 1 Element hat.


    Vielen Dank.


    Anbei hab ich das nächste kleine Problem und zwar hab ich als "Width" wrap content angegeben, wenn ich diese Text1 und Text2 Felder nun aus der Datenbank füllen lasse, sieht meine Ausgabe auf dem Spinner ungefähr so aus --> [Porsche________ Panam...] (die unterstriche sollen Leerzeichen darstellen) ich vermute das die Texte aus der Datenbank hinten mit Leerzeichen aufgefüllt sind. Bei "Column Marke VARCHAR20" und dem Wort "Porsche" darin, werden wohl 13 Leerzeichen hinten angefügt.
    Was denkst du? Ich komme eh erst morgen Abend wieder dazu mir dafür ne Lösung auszudenken :-!

  • Zitat

    Sonderfall indem man kein Layout braucht weil von anfang an keins da war


    Wie meinst du das denn? Da war natürlich von Anfang an eines, nur halt kein von dir manuell erstelltes.


    Zitat

    sieht meine Ausgabe auf dem Spinner ungefähr so aus


    Demnach hast du die TextViews nebeneinander statt 2zeilig angeordnet?



    Zitat

    ich vermute das die Texte aus der Datenbank hinten mit Leerzeichen aufgefüllt sind.


    Wie bzw. wo befüllst du die DB denn?
    Wenn da Leerzeichen sind, dann werden die vermutlich aus der ursprünglichen Quelle kopiert worden sein, SQLite hab ich das noch nie machen sehen, und schon gar nicht bei varchar()


    Die aus diversen Gründen bevorzugte Lösung würde natürlich darin bestehen, das die Leerzeichen erst gar nicht in die DB gelangen.
    Falls das nicht durchführbar ist (etwa weil du die DB nicht erstellst) wäre Plan-B die Verwendung von rtrim() im SQL Statement;
    Plan-C könnte noch die Verwendung eine ViewBinders sein.

  • hier ist der original Code vom "simple_spinner_item" ... da ist kein Layout drin.

    Code
    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:id="@android:id/text1"
    	style="?android:attr/spinnerItemStyle"
    	android:singleLine="true"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:ellipsize="marquee"
    	android:textAlignment="inherit"/>


    ...und ja ich hab ein LinearLayout drum rum gebaut, mit der orientation 'horizontal' ich will den Text nämlich so angezeigt haben
    Porsche Panamera
    und nicht so..
    Porsche
    Panamera


    aber ich glaub du hast recht, wahrscheinlich kommen die Leerzeichen von den EditText´s wenn ich die Texte hole und in die DB schreibe. Von meinen Java Erfahrungen kenne ich die .trim Methode aber was denn die .rtrim und wie verwende ich sie im SQL Statement ?


    Ich erstelle die Tabelle selbst, und in die DB schreibe ich mit folgendem Code (um ein paar Spalten gekürtzt)

  • Zitat

    da ist kein Layout drin.


    Ich darf dazu mal aus deinem Source zitieren?

    Zitat

    // set layout for activated adapter
    sca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);



    Zitat

    ich will den Text nämlich so angezeigt haben
    Porsche Panamera


    Das wäre dann auch mit dem Standard-Layout gegangen 8)
    "select _id, marke||' '||modell as t from tabelle..."



    Zitat

    was denn die .rtrim und wie verwende ich sie im SQL Statement ?


    http://www.brighthub.com/inter…ment/articles/119597.aspx

  • aso, ich meinte das LinearLayout das ich drum rum gebaut hab... ^^


    hm ok das geht also auch mit dem simple_spinner_item? ich verstehe nur deinen Code nicht, bzw wo ich den anwenden muss..

  • Zitat

    ich verstehe nur deinen Code nicht, bzw wo ich den anwenden muss..


    Das macht nichts, solange du deinen eigenen Code noch nicht verstehst, wäre das jetzt vielleicht auch ein bisschen viel des guten.
    Wenn du mit deiner jetzigen Lösung klar kommst, genau weißt warum und wie sie funktioniert und das hier dann immer noch wissen willst, dann können wir das gerne noch vertiefen.

  • Hi, also ich hab nun mit .trim() dafür gesorgt das die Texte die ich aus meinen EditText´s hole ohne Leerzeichen in die DB geschrieben werden. Aber ich hab nun leider immer noch das Problem das auf meinem simple_spinner_item (custom_spinner.xml)


    die Texte nachher immer noch so aussehen wie ich sie das letzte mal geschildert hab.


    Porsche_________Pana....


    und nun weiss ich echt nicht weiter...

  • Tja, ich kann da jetzt auch nur raten...
    Als erstes würde ich mal die Style-Zeilen entfernen, um auszuschließen, das es da irgendwelche paddings, margins o.ä. gibt
    Wenn das nicht zum Ziel führt, würde ich in die DB schauen um zu verifizieren, ob da nun Leerzeichen drin sind oder nicht.


    Die SQLite Doku sagt nichts über fixed length support, also gehe ich (zusammen mit meiner umfangreichen SQLite Erfahrung) mal davon aus, das die Blanks nicht beim select hinzu "gelogen" werden.
    Was du diesbezüglich noch tun könntest, um ganz sicher zu gehen wäre, die DB wegschmeissen und deine create table von "varchar()" auf "text" umstellen, da das der native Datentyp für SQLite ist.

  • Hi, also die styles weg zu machen hat etwas geholfen, es werden nun 2 Zeichen des zweiten Strings mehr angezeigt, aber leider noch lange nicht genug ;(
    Ich habe mit hilfe des SQLite_Debuggers (eine App) auf die Datenbank geschaut und da sieht es nicht danach aus, als wären dort Leerzeichen hinten dran. NIcht einmal nachdem ich versucht habe Leerzeichen hinein zu schmuggeln, mein Code ist also anscheinend gar nicht so schlecht B-)
    Als letztes habe ich von VARCHAR(20) auf TEXT(20) umgebaut, hatte leider keinen Effekt ;(
    Was hab ich denn noch für Vorteile, ausser das es der korrekte Datentyp für SQLite ist?


    Aber vielen Dank für deine Mühe... ;)

  • Zitat

    SQLite_Debuggers


    Kannst du sagen, wozu eine solche App zwingend root benötigt?
    Oder ist das nur, um die DBs in den privaten Speicherbereichen öffnen zu können?



    Zitat

    sieht es nicht danach aus


    Aber sicher weißt du es nicht?
    Wäre mir zu wenig ;)
    probier mal "select marke||'/'||hersteller from autos" in der app, dann solltest du sicher sehen, ob da Blanks sind oder nicht (die Namen sind natürlich zuvor den deinen anzupassen)



    Zitat

    Als letztes habe ich von VARCHAR(20) auf TEXT(20) umgebaut, hatte leider keinen Effekt ;(
    Was hab ich denn noch für Vorteile, ausser das es der korrekte Datentyp für SQLite ist?


    Zum einen wäre es korrekterweise nur "text" (ohne Größenangabe) und zum anderen hast du dadurch keine fassbaren Vorteile, im create etable Code steht bei SQLite wahrscheinlich etwas in der Art if token.matches("varchar(*)") or token.matches("char(*)") token = "text";
    der Vorteil ist das vermehrte Wissen über das von dir eingesetzte Werkzeug :)
    http://www.sqlite.org kennst du? Da würdest du bei Bedarf auch genaueres zu den Sachen finden, die ich gestern skizziert habe (rtrim, "||" etc)


    Wenn du Datenbanken mal irgendwann nicht mehr nur als Excel für Arme nutzen willst, sondern aus dem angebotenen Service u.a. erhebliche Arbeitsersparnis gewinnen möchtest, dann empfehle ich wärmstens das Einlesen in SQL-Syntax (allgemein und speziell SQLite) :)



    Zitat

    Aber vielen Dank für deine Mühe


    Gerne, aber eigentlich gibts in diesem Forum Knöpfen für sowas unter den Beiträgen, die das freigeschaltet haben (hab ich für diesen Beitrag zur Ansicht noch mal gemacht) 8)

  • Kannst du sagen, wozu eine solche App zwingend root benötigt?
    Oder ist das nur, um die DBs in den privaten Speicherbereichen öffnen zu können?

    keine ahnung für was das teil root braucht, aber mir wurde es empfohlen.


    Aber sicher weißt du es nicht?
    Wäre mir zu wenig ;)
    probier mal "select marke||'/'||hersteller from autos" in der app, dann solltest du sicher sehen, ob da Blanks sind oder nicht (die Namen sind natürlich zuvor den deinen anzupassen)

    so richtig?

    Java
    String sqlite = "SELECT " + CAR_MARKE + "||'/'||"
    				+ CAR_MODELL + " FROM " + TABLE_CAR;
    		Cursor c = myDatabase.rawQuery(sqlite, null);
    
    
    		String s = c.getString(c.getColumnIndexOrThrow(CAR_MARKE));
    		String t = c.getString(c.getColumnIndexOrThrow(CAR_MODELL));


    aber du könntest mir mal kurz Zusammenfassen was die "Pipes" und der "Slash" bewirken

    der Vorteil ist das vermehrte Wissen über das von dir eingesetzte Werkzeug :)

    :P damit hast du vollkommen recht



    Wenn du Datenbanken mal irgendwann nicht mehr nur als Excel für Arme nutzen willst, sondern aus dem angebotenen Service u.a. erhebliche Arbeitsersparnis gewinnen möchtest, dann empfehle ich wärmstens das Einlesen in SQL-Syntax (allgemein und speziell SQLite) :)

    ich hatte vor 2 Jahren in der Technikerschule n Jahr lang SQL, naja ich habs net so gemocht. Lag wahrscheinlich am Lehrer der sich immer an der dritten Normalform aufgegeilt hat... Habs aber trotzdem aufn 2er gepackt B-)



    Gerne, aber eigentlich gibts in diesem Forum Knöpfen für sowas unter den Beiträgen, die das freigeschaltet haben (hab ich für diesen Beitrag zur Ansicht noch mal gemacht) 8)

    danach hab ich bei allen Beitragen Ausschau gehalten ;)

  • ich wil aus 8.5 8.50 machen, oder aus 77 soll 77.00 werden. dazu benutze ich den Decimalformater


    Java
    totKost = Double.parseDouble(this.etTotKostenFuel.getText()
    							.toString().trim());
    					DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMANY);
    					symbols.setDecimalSeparator('.');
    					
    					DecimalFormat format = new DecimalFormat("#.00", symbols);
    					totKost = Double.parseDouble(format.format(totKost));


    was ist daran nun falsch?

  • Zitat

    keine ahnung für was das teil root braucht, aber mir wurde es empfohlen.


    Blöde Einschränkung, dann werde ich das gar nicht erst testen.


    Ich prüfe meine Daten und teste meine Statements eh lieber am PC ;)



    Zitat

    so richtig?


    Nicht raten.
    ...und nein, wenn der Schnipsel vollständig sein soll, dann enthält er mehrere Fehler.


    Mein Beispiel war eigentlich auch für den laut Beschreibung in der App enthaltenen Query-Builder gedacht ;)
    Aber schön, das du rawQuery() gefunden hast - auch wenn ich jetzt vermutlich Prügel von der Java-Fraktion erhalte: ich arbeite ausschließlich damit (mit voll ausformulierten SQL-Statements) ;)



    Zitat

    aber du könntest mir mal kurz Zusammenfassen was die "Pipes" und der "Slash" bewirken


    http://www.sqlite.org :P


    Die Pipes sind der concat operator (nicht nur) in SQLite und der Slash ist Bestandteil einer Textkonstante (daher die "'" links und rechts.
    Wenn alles richtig aufgeschrieben wird, liefert die Query Daten der Form "VW/Golf", so das du die eigentlichen Daten, aber auch evtl. vorhandene Blanks sehen kannst.



    Zitat

    Lag wahrscheinlich am Lehrer der sich immer an der dritten Normalform aufgegeilt hat...


    Ja, Normalformen sind zwar relevantes Wissen, aber mir ist auch schon öfter aufgefallen, das Lehrende darüber vergessen, den praktischen Nutzen hinreichend zu vermitteln.

  • Zitat

    was ist daran nun falsch?


    Was soll der Code denn eigentlich genau bewirken?
    totKost = Double.parseDouble(format.format(totKost));
    weist der Variablen in deinem Kontext theoretisch den Wert wieder zu, den sie am Anfang hatte...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!