Sprachausgabe aus einer Datenbank

  • Hi allerseits. Ich bin gerade an einem Projekt. Und zwar möchte ich Vokabel (Englisch Deutsch) in einer Datenbank speichern. Dabei habe ich die Spalten NR, Deutsch, Englisch. Das einfügen in die Datenbank funktioniert auch. Dann möchte ich die Vokabel durch eine Sprachausgabe ausgeben, wenn ich einen Button drücke.


    Die Funktion dafür sieht bei mir folgendermaßen aus:


    Die Methode getGermanByNR im DatabaseHelper:

    Code
    public Cursor getGermanByNR(Editable nr)
        {
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor res = db.rawQuery("select Deutsch from " + TABLE_NAME + " where NR == " + nr, null);
            return res;
        }

    Wenn ich den Button betätige, wird nicht das Wort ausgegeben, sondern "android.database.(irgendetwas, was ich nicht verstanden habe).(irgendeine nummer)"
    Ich schätze, ich habe in der abfrage irgendetwas falsch gemacht oder so.


    Kann mir vielleicht jemand weiterhelfen?

  • Kein wunder denn du holst auch den string falsch aus dem Cursor


    für die richtige zeile müste ich wissen in welcher Spalte der richtige String steht.
    damit meine ich die Spalte "NR"
    zeige mal wie deine Tabelle aufgebaut ist.


    res.moveToFirst();
    toSpeech.speak(res.getString(0), TextToSpeech.QUEUE_FLUSH, null);


    Das mit dem "==" ist arber auch falsch.
    Ps. eigentlich willst du ja nicht die spalte NR haben sondern den Deutschen oder Englichen String .
    somit ist es nicht die Spalte NR ich weis nicht wie die bei dier heist .


    zeige erst mal deine Tabelle.


    PS 2.
    oK du forderst nur die spalte Deusch an somit müsste 0 für die erste spalte im Cursor richtig sein .

  • Code
    public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table " + TABLE_NAME + " (NUMMER INTEGER PRIMARY KEY AUTOINCREMENT, DEUTSCH STRING, ENGLISCH STRING)");
        }

    Das ist meine Tabelle, also NR, Deutsch, Englisch.


    Müsste dann so die Zeile aussehen?


    Code
    res.moveToFirst();
    toSpeech.speak(res.getString(1), TextToSpeech.QUEUE_FLUSH, null);

    Und für das Englische Wort dann statt der 1 eine 2?

  • Nein du fragst nur nach dem Deutschen Word. Die beiden anderen Spalten werden gar nicht dem Cursor übergeben.


    Cursor res = db.rawQuery("select Deutsch from " + TABLE_NAME + " where NR == " + nr, null);
    Dieses Statement gibt dir nur die Spalte Deutsch zurück.
    somit müsste es

    • res.moveToFirst();
    • toSpeech.speak(res.getString(0), TextToSpeech.QUEUE_FLUSH, null);

    heisen.


    auch ist in deinem Statement "NR" falsch denn deine Spalte heist "NUMMER".
    Somit wird er nie das finden was du suchst.
    In dem SQL Statement solltest du die Bezeichner auch so schreiben wie du sie beim erstellen der Tabelle angegeben hast.
    De Befehsworte schreibt man gewöhnlich gross.


    Cursor res = db.rawQuery("SELEECT DEUTSCH FROM " + TABLE_NAME + " WHERE NUMMER = " + nr, null);





    Wenn du alle Spalten haben willst must du dein SQL Statement ändern.


    SELECTt * FROM tabelname WHERE NUMMER = nr


    würde alle Datenfelder vom datensatz an den Cursor übergeben.
    dann hättest du mit
    res.getInt(0) die Nummer
    res.getString(1) Deutsch
    res.getString(2) Englisch


    bei deiner Version bekommst du nur Deusch denn das forderst du auch nur an.


    Schaue die die Selekt anweisung von SQL nochmal genauer an.

  • Hab das jetzt so gelöst:

    Code
    Cursor words = Database.getWordsByNUMMER(editText.getText());
                        words.moveToFirst();
                        toSpeech.setLanguage(Locale.GERMAN);
                        toSpeech.speak(words.getString(0), TextToSpeech.QUEUE_ADD, null);
                        toSpeech.setLanguage(Locale.UK);
                        toSpeech.speak(words.getString(1), TextToSpeech.QUEUE_ADD, null);
    Code
    public Cursor getWordsByNUMMER(Editable nr)
        {
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor res = db.rawQuery("select Deutsch, Englisch from " + TABLE_NAME + " where NUMMER like " + nr, null);
            return res;
        }


    So funktioniert es. Aber jetzt will ich keine Nummer eingeben, sondern alle Vokabel nacheinander ausgeben. Das habe ich folgendermaßen realisiert:

    Code
    int length = Database.getLength();
                    for(int x = 1; x <= length; x++)
                    {
                        Cursor words = Database.getWordsByNUMMER(x);
                        words.moveToFirst();
                        toSpeech.setLanguage(Locale.GERMAN);
                        toSpeech.speak(words.getString(0), TextToSpeech.QUEUE_ADD, null);
                        toSpeech.setLanguage(Locale.UK);
                        toSpeech.speak(words.getString(1), TextToSpeech.QUEUE_ADD, null);
                    }



    Aber so funktioniert es aus irgendeinem Grund nicht.

  • Hallo also du solltest dich wirklich etwas mit SQL auseinandersetzen.



    Wenn du alle Daten Sätze die in der Tabelle sind ausgeben willst brauchst du gar keine WHERE Klausel angeben.
    Dann bekommst du als Rückgabe alle datensetze im Cursor.



    Was soll eigentlich “ where NUMMER like + nr“ macht für mich keinen sinn.


    Erstens wo ist der Regulare Ausdruck, zweitens macht das auf nummern sowieso wenig sinn.



    Nun schaue dir mal in der Doku an was es alles für Methoden für den Cursor gibt.
    https://developer.android.com/…e/android/database/Cursor



    Wenn du den Cursor mit einer for schleife durch gehen willst dann solltest du die Anzahl der Einträge im Cursor benutzen.
    res.getCount(); gibt dir einen int wert über Anzahl der im Einträge


    mit res.moveToNext(); gehst du zur nesten Cursor Position.


    Den Rest schaust du dir in der Doku an



    Die getLength Methode brauchst du nicht. Sinnvoller ist die Anzahl aus dem Cursor zu holen.


    Natürlich musst du den Cursor vor der For Schleife holen und nicht in der Schleife. Wieso nutzt du nicht die Möglichleiten die dir die DB bietet?


Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!