German SQL - Löschen vieler Zeilen einer Tabelle

Discussion in 'German Forum' started by kkolle, Mar 8, 2012.

  1. kkolle

    kkolle Member Licensed User

    Hallo!

    Ich lösche aus einer SQL-Tabelle innerhalb eines Services viele Zeilen aus einer Tabelle.

    Frage: Kann mir jmd. sagen, warum das Activity trotzdem "einfriert"?

    Vielen Dank!!

    Code:
    Sub Service_Start(StartingIntent As Intent)

       
    For c = 0 To SocketService.DataForTransactionMap.Size - 1
          Database.mySQL.ExecNonQuery2(
    "DELETE FROM DBLog WHERE id = ?"Array As String(SocketService.DataForTransactionMap.GetKeyAt(c)))

       
    Next
       
       SocketService.DataForTransactionMap.Clear

    End Sub
     
  2. Kiffi

    Kiffi Well-Known Member Licensed User

    viele Einzel-Delete-Anweisungen können in SQLite schon mal 'n Stückchen
    dauern. Versuch's mal wie folgt:

    Code:
    Dim IDs As String
    For c = 0 To SocketService.DataForTransactionMap.Size - 1
     IDs = IDs & SocketService.DataForTransactionMap.GetKeyAt(c))
     
    If c < SocketService.DataForTransactionMap.Size - 1 Then
      IDs = IDs & 
    ", "
     
    End If
    Next

    Database.mySQL.ExecNonQuery(
    "DELETE FROM DBLog WHERE id In " & IDs)
    Grüße ... Kiffi
     
  3. kkolle

    kkolle Member Licensed User

    Hi!

    Danke für die Antwort! An die Optimierung im SQL habe ich noch garnicht gedacht :) Mich wundert halt nur, dass trotz Service meine Activity einfriert.

    Ich werde es testen. Allerdings mit einem StringBuilder statt einem String. Sonst generiere ich dort die nächste "Bremse".
     
  4. Kiffi

    Kiffi Well-Known Member Licensed User

    ja, da hast Du recht. :)

    Grüße ... Kiffi
     
  5. corwin42

    corwin42 Expert Licensed User

    Weil ein Service im gleichen Thread ausgeführt wird wie die Activity. Um es "wirklich" im Hintergrund zu haben, müsstest Du einen eigenen Thread starten.

    Die Lösung von Kiffi könnte auch langsam sein, weil ein recht komplexes statement aufgebaut wird.

    Ich würde um den ganzen Block eine Transaktion packen:

    Code:
    Sub Service_Start(StartingIntent As Intent)

        Database.mySQL.BeginTransaction
        
    For c = 0 To SocketService.DataForTransactionMap.Size - 1
            Database.mySQL.ExecNonQuery2(
    "DELETE FROM DBLog WHERE id = ?"Array As String(SocketService.DataForTransactionMap.GetKeyAt(c)))

        
    Next
        
        Database.mySQL.TransactionSuccessful
        Database.mySQL.EndTransaction

        SocketService.DataForTransactionMap.Clear
    End Sub
    Aber wie gesagt, wenn es Deine Activity nicht beeinflussen soll, muss Du das in einem eigenen Thread machen.
     
    Last edited: Mar 8, 2012
  6. kkolle

    kkolle Member Licensed User

    @Kiffi:

    Vielen Dank! Der "Umbau" im SQL-Statement war schon mal ein Schritt in die richtige Richtung!

    Jetzt dauert das Löschen von 200 Datensätzen ca. 100 ms. In der GUI merkt man also (fast) nichts davon!

    @corwin42:

    Ahhh ... OK! Du hast nicht zufällig ein kleines Thread-Beispiel rumliegen? Oder gibt es schon eins im Forum?
    Das mit der Transaktion werde ich ebenfalls mal testen!!
     
  7. corwin42

    corwin42 Expert Licensed User

    Ich denke mal, dass Andrew bei seiner Library eins bei gepackt hat. Threading Library

    Ich musste bisher noch nichts in einem eigenen Thread machen. Aber ich meine, es war nicht so schwierig.
     
  8. kkolle

    kkolle Member Licensed User

    Mit einer Transaktion dauert das Löschen von 200 Datensätzen ebenfalls ca. 100 ms.

    Habe die Library von Andrew runtergeladen und werde es einbauen. Sieht wirklich einfach aus!

    Vielen Dank für Eure Hilfe!
     
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