[ERLEDIGT] In SQLite DB auf nächsten/vorherigen Datensatz zugreifen

lordzwieback

lordzwieback

Erfahrenes Mitglied
210
Guten Morgen Forum,

ich habe ein Problemchen beim Durchblättern der Datensätze in meiner kleinen aber feinen SQLite-Datenbank.

Ich beziehe mich jetzt in diesem Thread bzw. in den Codeschnipseln mal nur auf den "lastRecord", damit es nicht zu unübersichtlich wird. Und ja, ich weiß, eigentlich sollte es verständlicherweise nicht lastRecord, sonder previousRecord (oder prevRecord, wie auch immer) heißen, wird bei Gelegenheit noch umgebaut. :)

Folgende Funktionen benutze ich dafür...

lastRecord Funktion der DB Klasse
Code:
public Recipe_Struct lastRecord(Recipe_Struct struct) {
        Recipe_Struct lastStruct = new Recipe_Struct();
        File appDir = mContext.getExternalFilesDir(null);
        SQLiteDatabase database = new RecipeDB.SDBSQLiteHelper(mContext,appDir.toString()+ "/app_recipe.db").getWritableDatabase();

        Cursor c = database.rawQuery("SELECT * FROM recipe " +
                "WHERE name = '" + struct.name + "' " +
                "AND reqtime = '" + struct.reqtime + "' " +
                "AND ingredients = '" + struct.ingredients + "'", null);

        if (c != null) {
            if (c.moveToPrevious()) {
                lastStruct.name = c.getString(c.getColumnIndex("name"));
                lastStruct.reqtime = c.getInt(c.getColumnIndex("reqtime"));
                lastStruct.ingredients = c.getString(c.getColumnIndex("ingredients"));
            }
        }
        database.close();
        return lastStruct;
    }

Jetzt einmal der Sprung in meine Activity. Hier habe ich eine kleine Funktion, die mir beim Aufruf den aktuell dargestellten Datensatz in ein Strukturobjekt lädt:
Code:
private Recipe_Struct getDisplayedRecord() {
        Recipe_Struct struct = new Recipe_Struct();
        struct.name = name.getText().toString();
        struct.reqtime = Integer.parseInt(reqtime.getText().toString());
        struct.ingredients = ingredients.getText().toString();
        return struct;
    }

Und zum Schluss die OnClick Methode des "zurück"-Buttons:
Code:
lastRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Recipe_Struct struct = db.lastRecord(getDisplayedRecord());
                name.setText(struct.name);
                reqtime.setText(String.valueOf(struct.reqtime));
                ingredients.setText(struct.ingredients);
            }
        });

Die Funktionen scheinen alle zu laufen, aber ich bekomme immer eine leere Struktur zurück. In der DB befinden sich momentan drei Testdatensätze. Übersehe ich (mal wieder) etwas Offensichtliches? :D
 
Hallo Lord,

if (c != null) {
if (c.moveToPrevious()) {

Der Cursor steht in dem Moment auf (move) 0 , wie soll er dir dann einen "previous" ausgeben ?

Schreibe dir doch alle Ergebnisse in eine ArrayList und wurschtle da selbst dann rum .

Dann kannst du sie dir sogar mittels SORT im Query noch schön sortiert ausgeben .
Wenn es dann zu viel an Datensätzen wird , kannst du ja dir noch nen LIMIT reinbauen
(LIMIT 0,500 .... 501,1000)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: lordzwieback
Ich mach mich mal dran, mal schauen, wo ich rauskomme. :)
[doublepost=1490282370,1490275920][/doublepost]Also, vorweg: Ich weiß nicht, ob das jetzt so programmiert ist wie du das gemeint hattest.

Ich habe, bevor ich den Thread hier eröffnet habe schon eine Funktion geschrieben, die mir sämtliche Datensätze in der DB in eine ArrayList schreibt und das funktioniert auch, habs getestet. :D

Funktion lastRecord sieht jetzt so aus:
Code:
public Recipe_Struct lastRecord(Recipe_Struct struct) {
        Recipe_Struct lastStruct = new Recipe_Struct();
        ArrayList<Recipe_Struct> list = getAllRecords();

        for (Recipe_Struct x : list) {
            int lastIndex = list.indexOf(x) -1;
            if (lastIndex >= 0) {
                Log.d(TAG, "OBJECT IN ARRAY:\n" +
                        "name: " + x.name + "\n" +
                        "reqtime: " + x.reqtime + "\n" +
                        "ingredients: " + x.ingredients + "\n\n" +
                        "VERGLEICHE MIT SUCHOBJECT...\n" +
                        "name: " + struct.name + "\n" +
                        "reqtime: " + struct.reqtime + "\n" +
                        "ingredients: " + struct.ingredients);
                if (x.name.equals(struct.name) && String.valueOf(x.reqtime).equals(struct.reqtime) && x.ingredients.equals(struct.ingredients)) {
                    Log.d(TAG, "IN IF ABFRAGE");
                    lastStruct = list.get(lastIndex);
                }
            }

            Log.d(TAG, "Previous Recipe_Struct in ArrayList:\n" +
                    "Name: " + lastStruct.name + "\n" +
                    "Reqtime: " + lastStruct.reqtime + "\n" +
                    "Ingredients: " + lastStruct.ingredients);
        }
        return lastStruct;
    }

Prinzipiell funktioniert die Funktion auch. Ich lasse mir über die Logs ausgeben, welches Objekt aus dem Array gerade mit dem zu suchenden Objekt verglichen wird. Aus irgendeinem Grund springt er aber nicht in die if Abfrage if (x.name.equals(struct.name) && String.valueOf(x.reqtime).equals(struct.reqtime) && x.ingredients.equals(struct.ingredients)) , wenn die Strings gleich sind. Bekomme also auch hier immer noch eine leere Struktur zurück.

Bin jetzt gleich fürn paar Stunden weg, also nicht wundern, wenn ich auf eine Antwort erst später reagiere.
 
Ich habe, bevor ich den Thread hier eröffnet habe schon eine Funktion geschrieben, die mir sämtliche Datensätze in der DB in eine ArrayList schreibt und das funktioniert auch, habs getestet.

und warum dann verworfen ??
 
Code:
...&&String.valueOf(x.reqtime).equals(struct.reqtime)&&...
zu
Code:
...&&x.reqtime==struct.reqtime&&...
?

Denn
Code:
String.equals(Integer)
ist immer false, weil 2 unterschiedliche Klassen!
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: lordzwieback
swa00 schrieb:
und warum dann verworfen ??
Hab sie nicht verworfen. Da wird sie genutzt, um die ArrayList zu füllen:
Code:
ArrayList<Recipe_Struct> list = getAllRecords();

@Jaiel Oh Mann, bin ich doof :D
Hab mir wohl gedacht "ok, ich vergleiche zwei gleich aufgebaute Strukturen miteinander, also .equals bei den Strings und dann noch die Integer... hmmm besser mal umwandeln"... danke für den "Schlag auf den Hinterkopf" :D

Ah und falls es noch nicht klar wurde, es funktioniert jetzt, yay. ^^
 
  • Danke
Reaktionen: Jaiel und swa00

Ähnliche Themen

R
Antworten
6
Aufrufe
1.014
swa00
swa00
M
  • MikelKatzengreis
Antworten
5
Aufrufe
128
swa00
swa00
Zurück
Oben Unten