German DBUTILS Daten aus DB auslesen

Discussion in 'German Forum' started by pjo12345, Aug 7, 2018.

Similar threads

B4J Library [B4X] DBUtils 2
B4A Tutorial DBUtils - Android databases are now simple!
B4J Tutorial DBUtils Example
B4J Tutorial TableView Tutorial
B4i Library [module] DBUtils
  1. pjo12345

    pjo12345 Active Member Licensed User

    Hallo Leute!

    Ich schreibe meine Daten in eine SQL Datenbank. Das sollte soweit funktionieren. Hier mal der Code:
    Code:
    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:
    Code:
    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: Aug 7, 2018
  2. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    statt einer Liste einen Cursor benutzen und dann machst du folgendes:

    Code:
    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
     
  3. rboeck

    rboeck Well-Known Member Licensed User

    Ersetze 'Beginn' in der Zeile mit ExecuteMemorytable mit * und du bekommst beide Werte.
     
  4. klaus

    klaus Expert Licensed 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:
    Code:
    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:
    Code:
    TestListe =  DBUtils.ExecuteMemoryTable(sql,"SELECT * FROM daten"Null0)
    Dann muss die Routine so aussehen, und Du willst aber wahrscheinlich die Tickwerte auch wieder in Long umwandeln.
    Code:
    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: Aug 7, 2018
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice