German DBUTILS Daten aus DB auslesen

pjo12345

Active Member
Licensed User
Longtime User
Hallo Leute!

Ich schreibe meine Daten in eine SQL Datenbank. Das sollte soweit funktionieren. Hier mal der Code:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    sql.Initialize(rp.GetSafeDirDefaultExternal(""),"daten.db",True)   
    If DBUtils.TableExists(sql,"daten.db") = False Then
        DBUtils.CreateTable(sql, "daten", CreateMap("beginn": DBUtils.DB_TEXT, "ende": DBUtils.DB_TEXT), "beginn")
    End If
End Sub

Sub DatenInDatenbankSchreiben
    Dim zeilen As List
    zeilen.Initialize
    Dim Eintrag As Map
    Eintrag = CreateMap("beginn": ArbeitsBeginn, "ende": ArbeitsEnde)
    zeilen.Add(Eintrag)
    DBUtils.InsertMaps(sql, "daten", zeilen)
End Sub

Es werden also nur zwei Werte in die DB geschrieben. Die beiden Werte sind Ticks.

Nun möchte ich diese wieder aus der DB auslesen. Und da komme ich nicht wirklich weiter. Versucht habe ich das so:
B4X:
Sub DatenAusDatenbankLesen
    Dim TestListe As List
    TestListe.Initialize
    TestListe =     DBUtils.ExecuteMemoryTable(sql,"SELECT beginn FROM daten",Null,0)
  
    For i = 0 To TestListe.Size-1
        Dim value() As String
        value = TestListe.Get(i)
        Log("Value= " & value(i))
    Next
  
End Sub

Nur bekomme ich nur einen Wert ausgelesen. Es müssten aber zwei sein. Wie komme ich jetzt an den zweiten Wert?

Da bräuchte ich mal eure Hilfe.

Vielen Dank schon einmal.
 
Last edited:

Alexander Stolte

Expert
Licensed User
Longtime User
Dim TestListe As List
statt einer Liste einen Cursor benutzen und dann machst du folgendes:

B4X:
Dim testcursor as cursor 'erstellen den cursor
testcursor = sql.ExecQuery("SELECT beginn FROM daten") 'befüllen den cursor

for i = 0 to testcursor.RowCount -1 'schleife mit dem rowcount von den results aus der select anweisung

testcursor.position = i 'damit wir auch die richtige position ansteuern können
log("Value: " & testcursor.GetString("beginn")) 'gibt den string aus, einfach den column angeben den du willst in diesem fall haben wir nur den column beginn

Next

testcursor.close 'cursor wird nicht mehr benötigt, also können wir die resscource freigeben

Sollte was nicht stimmen, dann Entschuldigung, hab dies jetzt aus dem Kopf geschrieben ohne den B4A Editor.
Ein Cursor ist für diese Dinge am besten geeignet, denk aber daran, dass ein Cursor maximal 2 MB an Daten gleichzeitig aufnehmen kann, sollte deine SELECT Anweisung Millionen von Zeilen ausgeben, dann sollte das zu einem Problem führen. Dies kann man aber einfach lösen, kommt aber dann auf die Situation an.

Gute Nacht
 

rboeck

Well-Known Member
Licensed User
Longtime User
Ersetze 'Beginn' in der Zeile mit ExecuteMemorytable mit * und du bekommst beide Werte.
 

klaus

Expert
Licensed User
Longtime User
Zuerst, Ticks sind Long Variablen. Ich würde die Spalten also nicht als DBUtils.DB_TEXT sondern als DBUtils.DB_INTEGER definieren.

ExecuteMemorytable erstellt eine List mit String Arrays für jede Zeile.
Deine Routine muss so aussehen:
B4X:
For i = 0 To TestListe.Size-1
    Dim value() As String
    value = TestListe.Get(i)
    Log("Value= " & value(0))
 Next
value(0), weil Du nur einen Wert hast.

Falls Du, wie schon vorgeschlagen, das machst:
B4X:
TestListe =  DBUtils.ExecuteMemoryTable(sql,"SELECT * FROM daten", Null, 0)
Dann muss die Routine so aussehen, und Du willst aber wahrscheinlich die Tickwerte auch wieder in Long umwandeln.
B4X:
For i = 0 To TestListe.Size-1
    Dim value() As String
    Dim Beginn, Ende As Long
    value = TestListe.Get(i)
    Beginn = value(0)  'Tick Wert in Long umwandeln
    Ende = value(1)  'Tick Wert in Long umwandeln
    Log("Beginn = " & Beginn)
    Log("Ende = " & Ende)
 Next

Ich, persönlich, benutze DBUtils nicht, Ich bevorzuge direkte SQLite Funktionen.
Ich finde es einfacher und weiss besser was ich mache.

Im B4A User's Guide gibt es ein Kapitel SQLite Database mit Beispielen, auch ein Kapitel DBUtils mit Beispielen.
 
Last edited:
Top