SQLite Datenbankabfrage als Task ausführen

  • Antworten:6
  • OffenNicht stickyBentwortet
  • 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

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 1.219

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?
Diskutiere mit!
  • Forum-Beiträge: 1.219

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
  • Forum-Beiträge: 1.219

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 1.219

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?
Diskutiere mit!
  • 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?
Diskutiere mit!
Empfohlene Artikel bei NextPit