German SQLilte Probleme

ruheloser

Member
Hallo Leute,

Habe ein Problem bei einer SQL-Abfrage

unter Android 4.2 funktioniert dies:
B4X:
sQuery = "SELECT name, frech, categorie, saison FROM items INNER JOIN saison ON items.id = saison.item_id" _
        & " WHERE saison = '" & iMonth & "' AND categorie = '" & sCatId &"'"

oCursor = oDatabase.ExecQuery(sQuery)

bei einer höheren Android Version funktioniert dies nicht mehr, es kommt aber auch keine Fehlermeldung, der oCursor.RowCount ist einfach nur 0

Auch eine Umstellung auf:
B4X:
sQuery = "SELECT name, frech, categorie, saison FROM items INNER JOIN saison ON items.id = saison.item_id WHERE saison = ? AND categorie = ?"

oCursor = oDatabase.ExecQuery2(sQuery, Array As String(iMonth, sCatId))

ändert daran nichts. Sobald ich in einer Abfrage eine Where-Clausel habe bekomme ich kein Ergebnis
 

rboeck

Well-Known Member
Licensed User
Longtime User
Ich denke nicht, dass die Android Version etwas damit zu tun hat. Sqlite hat die ungewohnte Eigenschaft, dass es Feldwerte als String und numerisch übenimmt, ohne sich darüber zu beschweren. So kann es dann passieren, dass der verwendete Datentyp bei der Abfrage zu anderen Ergebnissen führt. Probiere die zweite Abfrage und dimensioniere die Werte probeweise als Integer.
Um diesen Fehler aufzuspüren, hilft es auch, mit dem Suchwert zu sortieren. Hier werden dann Strings vor Integer ( oder umgekehrt ?!) sortiert.
Kannst Du evtl. eine Testdatenbank online stellen?
 

ruheloser

Member
Ich habe es jetzt noch mal getestet, alle Felder in den Tabellen sind von Datentyp TEXT

B4X:
Private Sub CreateItemTable
  
    sQuery = "CREATE TABLE items(id TEXT Not Null, name TEXT Not Null, categorie TEXT Not Null, calories TEXT Not Null, protein TEXT Not Null," _
              & "roughage TEXT Not Null, fat TEXT Not Null, carbohydrates TEXT Not Null, sugar TEXT Not Null, " _
              & "taste TEXT Not Null, import TEXT Not Null, storage TEXT Not Null);"
  
    oDatabase.ExecNonQuery(sQuery)
  
End Sub

Da die komplette Datenbank komplett im Code aufgebaut wird und mit externen Daten gefüllt wird kann ich nur den kompletten Code mit geben.

Wie gesagt klappt alles bis auf die Abfrage mit WHERE Klausel höher als Android 4.2

sCategorie gibst du den Wert "Obstkalender" wenn du Testen möchtest.
 

Attachments

  • Database.bas
    8 KB · Views: 173
Last edited:

rboeck

Well-Known Member
Licensed User
Longtime User
Hallo,

hatte Deine Antwort übersehen; ich habe in der Zwischenzeit die Datenbank bilden können und auf den PC übertragen. Mit SQLite Expert sehe ich mit den Aufbau an und teste auch gerne solche Problemfälle aus. Wenn ich Deine Abfrage ohne where Einschränkung verwende, komme ich auf 240 Datensätze; das Problem kommt, wenn die iMonth Bedingung selektieren soll - in diesem Feld sind die Werte gelb, rot und grün enthalten, die Suche nach einem Monatszahl liefert daher richtigerweise keinen Datensatz zurück. Falls Du die Datenbank auch selbst am PC testen willst, kannst Du mit der Zeile :
B4X:
File.Copy(File.DirInternal,"saison.db",File.DirRootExternal,"saison.db")
die Datenbank in das externe Directory des Androiden legen und von dort kompieren. Was auch zu Missverständnissen führen könnte: saison ist sowohl als tabellenname, als auch als Feldname innerhalb von saison in Verwendung. Wird wahrscheinlich schon funktionieren, aber könnte Fehler begünstigen.
Falls Du die Datenbank benötigst, kann ich sie auch per email senden.
 

ruheloser

Member
komme ich auf 240 Datensätze; das Problem kommt, wenn die iMonth Bedingung selektieren soll - in diesem Feld sind die Werte gelb, rot und grün enthalten


Dies ist falsch, weil in der Spalte frech die Werte rot, gruen, gelb stehen. Und ein letztes Mal: Diese Abfrage funktioniert unter Android 4.2, bei einer höheren Android Version liefert die gleiche Abfrage kein Datensatz zurück. Es darf durchaus eine Spalte die gleiche Bezeichnung haben wie eine andere Tabelle, dies ist SQL-Standart.
 
Last edited:

rboeck

Well-Known Member
Licensed User
Longtime User
Ich habe deinen Code zum Erstellen und Füllen der Datenbank ohne Änderung ausgeführt und bin zu dieser Tabelle Saison gekommen, in der die Inhalt von saison und frech vertauscht sind. Meine Tests habe ich am PC durchgeführt; ich verstehe daher noch immer nicht, was die Android Version da ändern soll. Eine Abfrage wird an die sqlite Engine weitergegeben und von dieser ausgeführt.
Hier eine Zeile aus dem Debugger:

INSERT INTO saison(frech, id, item_id, saison)VALUES('1', '1', '1', 'gruen'),('2', '1', '2', 'gruen'),('3', '1', '3', 'gruen'),('4', '1', '4', 'gruen',

Für mich geht klar hervor, dass saison mit den Farbwerten gefüllt wird.
 

ruheloser

Member
Vielen Dank, ich habe den Fehler gefunden, da in der einen Spalte falsche Werte bei dir waren. Konnte ich den Fehler finden. Es lag am JSON - String der vom Server zurück kam. Die Methode InsertIntoTable ist jetzt voll Dynamisch. :) Und das mit dem JSON - String liegt wohl doch an der Android-Version
 

rboeck

Well-Known Member
Licensed User
Longtime User
Könntest Du Deinen letzten Satz näher erklären - ein JSON String verändert sich, ja nach Android Version?!
 

ruheloser

Member
Ja hat er, er hatte bei mir eine andere Reihenfolge, das sah es nämlich so aus:
INSERT INTO saison(frech, id, item_id, saison)VALUES('gruen', '1', '1', '1'),('gruen', '2', '1', '2', 'gruen'),('gruen', '3', '1', '3') usw. Und jetzt komme mir bitte nicht das es nicht sein kann, ist so, ist eh anders geordnet als was der Server vorgibt.
Habe es aber jetzt so gelöst das es voll dynamisch gemacht wird.
Bei mir Android 4.2. ging die Selectabfrage bei meinen Kumpel Android 5 nicht. Das ist Tatsache.
 

DonManfred

Expert
Licensed User
Longtime User
Du kannst niemals davon ausgehen das ein json string immer in der gleichen Reihenfolge kommt. zumindest habe ich da was im Kopf, da´Erel mal irgendwo schrieb man können sich nicht auf die Reihenfolge verlassen.
 

ruheloser

Member
Ist dann aber traurig von PHP und Javascript bin ich anderes gewohnt. Der Json String wird unter PHP zusammengestellt, dann müsste man auch davon ausgehen, das er immer auf die gleiche Art und weise verarbeitet wird.
 
Top