SQLite Datenbankabfrage als Task ausführen

  • Antworten:6
  • Bentwortet
Sarom Mean
  • Forum-Beiträge: 4

25.07.2020, 00:24:19 via Website

Guten Tag.
ich bin ein Umsteiger von Visual Srudio zu Android Studio uhc versuche eine Datenbamkabfrage zu schreibeb, beim Test hat soweit funktioniert aber irgend wann ahbe ich doch Probel, dass bei große Datenmenge eine Fehlermeldung kommt, dass die Abfrage zu lange dauert. Ich habe von einem Freund gehört, dass ich solche Problem mit Async... awain lösenkann, wie kann er auch nicht sagen.
Kann mir jemand helfen, das Programmstück mit async zu lösen?

func Query(TableName:String,projection:Array<String>,selection : String, selectionArgs:Array<String>,sorOrder : String) : Cursor{
    val qb = SQLiteQueryBuilder()
    qb.tables = TableName
    val cursor = qb.query(sqlDB,projection,selection,selectionArgs,null,null,sorOrder)
     return cursor

}

Danke

— geändert am 25.07.2020, 00:25:46

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

26.07.2020, 13:07:21 via Website

Hallo hier ein einfaches Beispiel. In Kotlin.

    import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteQueryBuilder
import android.os.AsyncTask

class AsyncTest(val context: MainActivity,
                val sqlDB: SQLiteDatabase,
                val tableName: String,
                val projection: Array<String>,
                val selection: String,
                val selectionArgs: Array<String>,
                val sorOrder: String) : AsyncTask<Void?, Void?, Cursor?>() {


    protected override fun doInBackground(vararg params: Void?): Cursor? {
        val qb = SQLiteQueryBuilder()
        qb.tables = tableName
        val cursor = qb.query(sqlDB, projection, selection, selectionArgs, null, null, sorOrder)
        return cursor
    }

    override fun onPostExecute(result: Cursor?) {
        super.onPostExecute(result)
        if (result != null) {
            context.updateCursor(result)
        }
    }
}

Der aufruf in der MainActivity in etwas so
val asy = AsyncTest(this@MainActivity, ........)
asy.execute()

und die Methode oder Funktion in der MainActivity die aufgerufen wird wenn der Task beendet ist.
entspricht so zusagen einem Listener.

das Arbeiten mit Listeners sollte dir bekannt sein.

public fun updateCursor(cursor:Cursor) {
// hier dein Code für den Cursor zum anzeigen.
}

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

25.07.2020, 08:22:40 via Website

Hallo dann schaue dir doch mal die Doku zu asynctask an.
https://developer.android.com/reference/android/os/AsyncTask#asynctasks-generic-types

Die Abfrage also der Teil der Lange dauert kommt in die doinbackrund Methode . Nur diese läuft in einen eigenen Thread.

https://www.it-swarm.dev/de/java/geben-sie-einen-wert-von-asynctask-android/942062298/amp/

— geändert am 25.07.2020, 09:27:14

Hilfreich?
Kommentieren
Sarom Mean
  • Forum-Beiträge: 4

25.07.2020, 22:20:11 via Website

Hallo Jokel.
Danke für dein schnell Tip,.
Leider habe ich nicht verstanden und weiß nicht, wie ich in meinem Projekt realisieren kann, das kann daran liegen, dass ich zu wenig erfahrung mit Android Studio/Kotlin habe.
Das ist mein erste gehversucht in der App-Programmierung und der Umstieg von Visual Studio in die Android Studio tut mir schwer, obwohl ich reggut in VB und C# bin.
Trotz dem vielen Dank.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

25.07.2020, 22:48:51 via Website

Dann soltest du dich mal mit Multithreading beschäftigen. Das gibt es, aber auch bei den von dir genanten Sprachen.
AsyncTask ist fast das gleiche wie async await bei C#. Auch in VB gibt es Multithreading , und OOP.

Leider ist AsyncTask ab Android 11 deprecated. Aber dafür gibt es in Kotlin Coroutines.
Für welches target Sdk schreibst du. Bis 30 sollte AsyncTask laufen gleich ob java oder kotlin.

— geändert am 25.07.2020, 23:48:50

Hilfreich?
Kommentieren
Sarom Mean
  • Forum-Beiträge: 4

26.07.2020, 11:30:48 via Website

Hallo Jokel.
Ich möchte ein kleine Datenbank(mit 5 SQLite-Tabele) zur Verwaltung von Familiengeschäft meiner Schwester in einer Sprache der sudost asiatische Land.

Drezeit lerne ich gerade Android Studio mit Kotlin kennen, da ich schon vorher in VB recht viel Datenbank programiert habe, habe ich hier in der Datenbankbereich auch recht schnell verstanden, aber in Multitasking habe ich echt Problem, obwohl ich in VB auch Multitaskin programiert habe.

LG

— geändert am 26.07.2020, 11:31:02

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

26.07.2020, 13:07:21 via Website

Hallo hier ein einfaches Beispiel. In Kotlin.

    import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteQueryBuilder
import android.os.AsyncTask

class AsyncTest(val context: MainActivity,
                val sqlDB: SQLiteDatabase,
                val tableName: String,
                val projection: Array<String>,
                val selection: String,
                val selectionArgs: Array<String>,
                val sorOrder: String) : AsyncTask<Void?, Void?, Cursor?>() {


    protected override fun doInBackground(vararg params: Void?): Cursor? {
        val qb = SQLiteQueryBuilder()
        qb.tables = tableName
        val cursor = qb.query(sqlDB, projection, selection, selectionArgs, null, null, sorOrder)
        return cursor
    }

    override fun onPostExecute(result: Cursor?) {
        super.onPostExecute(result)
        if (result != null) {
            context.updateCursor(result)
        }
    }
}

Der aufruf in der MainActivity in etwas so
val asy = AsyncTest(this@MainActivity, ........)
asy.execute()

und die Methode oder Funktion in der MainActivity die aufgerufen wird wenn der Task beendet ist.
entspricht so zusagen einem Listener.

das Arbeiten mit Listeners sollte dir bekannt sein.

public fun updateCursor(cursor:Cursor) {
// hier dein Code für den Cursor zum anzeigen.
}

Hilfreich?
Kommentieren
Sarom Mean
  • Forum-Beiträge: 4

26.07.2020, 16:09:21 via Website

Hallo Jokel.
Danke für Beispiel.
Ich habe verstanden und fastohne Aufwand mit meinem bereit geschriebene Programm kombinieren und es funktioniert einwandfrei.
Vielen vielen Dank!

Hilfreich?
Kommentieren