German Eine Spalte aus Tabelle einlesen

derMartin

Member
Licensed User
Longtime User
Hallo Community,

bin janz neu hier und gleich mal die erste Fage. Kurz vorweg, ich entwickle seit einigen Jahren, bisher unter Vusial Studio, okay, damals VB6. Jetzt wollte ich in die Android-Welt schnuppern.

Folgends, ich möchte aus einer Datenbank die die Tabelle "Benutzer" enthält, nur die Spalte "Name" auslesen und in einen Spinner lesen.

Mein Ansatz sieht so aus:

SQL.Initialize(Dir, FileName, False)
Cursor1 = SQL.ExecQuery("SELECT Name FROM Benutzer")
For i = 0 To Cursor1.RowCount - 1
Cursor1.Position = i
spBenutzer.Add(Cursor1.GetString("Name"))
Next
Cursor1.Close

Hab ich hier irgendwo gefunden, allerdings wird nur der erste Name eingelesen..... HAt jemand eine Idee für mich ?

Danke im vorraus
 

klaus

Expert
Licensed User
Longtime User
Der Code ist richtig.
Versuche mal folgendes:
B4X:
Log(Cursor1.RowCount)
For i = 0 To Cursor1.RowCount - 1
Cursor1.Position = i
spBenutzer.Add(Cursor1.GetString("Name"))
Next
Um herauszufinden wie viele Einträge die SQLIte Query zurück gibt.

Bist Du sicher dass in deiner Datenbank mehr als ein Eintag drin ist ?
 

derMartin

Member
Licensed User
Longtime User
Jo, also Ausgabe ist 1
Ich bin auch ein Honk....... Ich habe natürlich die Kopie meiner Datenbank aufs Telefon verschoben..... Grummer...... Danke für deinen Hinweis.... Jetzt werden alle Namen im Spinner aufgelistet.

Ich hole mir jetzt einen Kaffee ;)

Danke nochmal
 

DonManfred

Expert
Licensed User
Longtime User
Ich hab ein ähnliches hier mal ausprobiert und es klappt bei mir wie gewünscht. Sicher, dass in der Tabeller auch mehrere Datensätze vorhanden sind? Kannst Du mit einem

B4X:
Log(Cursor1.RowCount&" Rows im Resultcursor")

überprüfen (muss debug sein sonst kommt es nicht im log an)
 

DonManfred

Expert
Licensed User
Longtime User
Jo, also Ausgabe ist 1
Ich bin auch ein Honk....... Ich habe natürlich die Kopie meiner Datenbank aufs Telefon verschoben..... Grummer...... Danke für deinen Hinweis.... Jetzt werden alle Namen im Spinner aufgelistet.

Kaum macht man(n) es richtig, geht´s! :)

Schön, dass es nun klappt.
 

derMartin

Member
Licensed User
Longtime User
Jetzt hab ich nochmal eine Frage. Wollte nicht extra einen Thread aufmachen. Unter Visual Studio konnte ich mittels combobox1.text ="Text" mir einen beliebiegen Text anzeigen lassen. Beim spinner kann ich nur per .add einen Text hinzufügen. Dieser Wird jedoch ganz am Ende der Auflistung plaziert (ge-addet). Hintergrund ist, ich habe Altersangaben, sagen wir von 30 bis 80, so, jetzt wird aus der DB der Wert 35 geladen. Unter VS wäre über combobox1.text = rs.fields("Alter") der Wert korrekt angezeigt, trotz Werten von 30-80. Im Spinner hängt er die am Ende dran, obwohl es schon eine 35 gibt.... Ich hoffe jemand versteht mein Problem.

Danke im vorraus.
 

klaus

Expert
Licensed User
Longtime User
Um den Spinner zu füllen kannst Du die SQL Query so schreiben:
"SELECT DISTINCT Alter FROM Benutzer ORDER BY Alter ASC"
DISTINCT elimiert mehrfache gleiche Einträge
ORDER ordnet die Einträge ASC aufwärts oder DESC abwärts.

Siehe hier.

Man kann leider einen Eintrag in einem Spinner nicht direkt ändern.
Zwei Möglichkeiten:
- Den Spinner leeren und neu füllen.
- Deinen eigenen Spinner schreiben.

Ich habe kürzlich eine Class erstellt mit einer eigenen ComboBox, da mir die Standardmöglichkeiten zu wenig waren.
 

derMartin

Member
Licensed User
Longtime User
Hallo Klaus,

ich glaube mein Problem nicht vernünftig erklärt zu haben. Wobei das natürlich stimmt, so vermeide ich doppelte Einträge.
Versuche ich das mal so, Jemand wählt aus einem Spinner seinen Namen (Ich schreib an einem kleinem Trainingsplaner) , nach Auswahl des Namens wird aus der DB die dazu gehörenden Körperdaten geladen, auch das alter. Jetzt hab ich vorher den Spinner gefüllt, mit Alter von 30-80 (Okay, bei Alter blöd, bei Gewicht wäre das sinnvoller, das schwankt ja öfter) . Das Programm lädt das Alter auch , legt es aber per .add zusätzlich in den Spinner. Also hier würde der SQL Distinct gar nicht greifen. Der Spinner soll einfach nur das geladene Alter z.b. 35 direkt im SPinner anzeigen und nicht am Ende hinzufügen....
 

derMartin

Member
Licensed User
Longtime User
Ich probiere es gleich mal aus. Danke.

Ah, ich hab da gleich noch was, ein SQL Update funktioniert bei mir nicht. Und wenn irgendwas SQL mäßig nicht läuft teste ich den SQL String auf dem PC. Nu hab ich folgende Problem, das
theSql ="UPDATE Benutzer SET 'Geschlecht' = 'true false', 'Groesse' = '170', 'Gewicht' = '80', 'Alter' = '33' WHERE 'BenutzerName' = 'Martin'"
zwar keinen Fehler liefert, aber in der DB nichts ändert. Teste ich den selben String im SQLite Manager auf dem Rechner gehts ohne probleme.....

INSERT INTO funktioniert ohne Probleme......

Habt ihr da vielleicht eine Idee ? (Die Werte hab ich händisch reingeschrieben, sind Strings zwischen.)
 

derMartin

Member
Licensed User
Longtime User
Der Typ ist Text. Im SQLite Manager funzt es ja...... bei der gleichen DB. Klar das mit dem Geschlecht kann man anders lösen...
 

DonManfred

Expert
Licensed User
Longtime User
Ok, dann hast du halt "true false" in dem Feld stehen. Ob das sinn macht lasse ich mal dahingestellt.
Anders gefragt; was genau funktioniert nicht bei deinem UPDATE-SQL-Statement?

Wird davon NICHTS im Datensatz geändert? Wird es nur teilweise geändert?

Nu hab ich folgende Problem, das
theSql ="UPDATE Benutzer SET 'Geschlecht' = 'true false', 'Groesse' = '170', 'Gewicht' = '80', 'Alter' = '33' WHERE 'BenutzerName' = 'Martin'"
zwar keinen Fehler liefert, aber in der DB nichts ändert.

Du sendest den string aber auch noch ab, oder? Nur das definieren eines Strings mit einem gültigen SQL-Statement macht noch keine Änderung(en) an der DB.

B4X:
SQL.ExecNonQuery(theSql)
 

derMartin

Member
Licensed User
Longtime User
Abgesendet wird er, hier der ganze Sub

B4X:
Sub BenutzerAendern (TheBen)

Dim theSQL As String
theGeschlecht = rbMännlich.Checked & " " & rbWeiblich.Checked
theSQL = "UPDATE 'Benutzer' SET 'Groesse' = '" & sbGroesse.Value  & "', 'Geschlecht' = '" & theGeschlecht & "', 'Gewicht' = '" & sbGewicht.Value & "', 'Alter' = '" & sbAlter.Value & "' WHERE  'BenutzerName' = '" & TheBen & "'"
'theSql ="UPDATE Benutzer SET 'Geschlecht' = 'true false', 'Groesse' = '200', 'Gewicht' = '150', 'Alter' = '40' WHERE  'BenutzerName' = 'Martin'"
    If SQL.IsInitialized Then SQL.Close
        Try
  
            SQL.Initialize(thePfad, theDatei, False)  
            SQL.ExecNonQuery(theSQL)
            ToastMessageShow("Benutzerdaten geändert.", True)
        Catch
            ToastMessageShow("Fehler beim Speichern.", True)
    End Try
End Sub
 

DonManfred

Expert
Licensed User
Longtime User
1. Welche der beiden ToastNachrichten erscheint?
2. Wenn SQL doch bereit initialisiert ist; warum schliesst Du es dann um es dann neu zu initialisieren?
Du bräuchtest doch nur in der bereits initialisierten Instanz den ExecNonQuery absenden.
 

derMartin

Member
Licensed User
Longtime User
Die ´positive´ Nachricht......
Allerdings bleibt die DB unverändert. Selbst mein neu hinzugefügtens Benutzer löschen geht, alles funzt außer dem Update...
 

DonManfred

Expert
Licensed User
Longtime User
Vielleicht hilft es das Update in eine Transaction zu packen? Ich habe mit SQLite noch nicht viel machen können (arbeite eher unter windows und mit MySQL.

B4X:
SQL1.BeginTransaction
SQL1.ExecNonQuery(theSql)
SQL1.EndTransaction

Alternativ könntest Du versuchen die Feldnamen direkt anzusprechen ohne sie in ' einzuschliessen.

B4X:
theSQL = "UPDATE Benutzer SET Groesse = '" & sbGroesse.Value  & "', Geschlecht = '" & theGeschlecht & "', Gewicht = '" & sbGewicht.Value & "', Alter = '" & sbAlter.Value & "' WHERE  BenutzerName = '" & TheBen & "';"
 

derMartin

Member
Licensed User
Longtime User
Funktioniert alles nicht. Egal was ich mache, Update funktioniert schlicht nicht. Ich habe es mal mit nur einem Wert versucht. Keine Chance. Verstehe es nicht, arbeite seit einigen Jahren Privat wie in der Firma mit Datenbanken und sowas ist mir noch nicht untergekommen.
Werde das jetzt erstmal so löschen, Delete und dann Insert Into. Bins leid Stundenlang an so einer kleinigkeit zu sitzen........ Aber trotzdem Danke für die Hilfe.


Kurzer Update, ich habe Wert für Wert durchprobiert. Es funktioniert mit allen Werten außer dem Alter...... da muß ich nochmal hinterher haken.....

So, noch ein Update. Habe in der DB die Spalte 'Alter' in 'BenAlter' umbenannt. Und was soll ich sagen, es funktionert.... Verstehen tu ich das nicht.
 
Last edited:
Top