Beiträge von halfbrain

    Benötigt man spezielle Befehle wenn man mit einem Cursor auf die Spalte mit den FOREIGN KEYS zu greifen möchte?



    Wenn ich auf die Spalte mit dem FOREIGN KEY zugreifen möchte mit cursor.getLong(nummerDerKeySpalte) bekomme ich Exception "java.lang.IllegalStateException: Couldn't read row 0, col 5 from CursorWindow.......



    Irgendwie scheint die Spalte gar nicht sichtbar zu sein. Ich kann zur Laufzeit mit keinem gängigen Befehl wie Cursor.getXXX(nummerDerKeySpalte) zu greifen. Ebenfalls wird sie bei Cursor.getColumnCount() nicht mitgezählt.



    Ich hab die Datenbank aus dem Emulator rausgezogen und im "DB Browser for SQLite" angeschaut. Spalten sind alle vorhanden und auch die jeweiligen id Einträge der FOREIGN KEY Spalten stimmen. Also die Datenbank scheint korrekt abgespeichert zu sein nur zugreifen darauf kann ich nicht.



    Ich hab die Spalte auch explizit im OnCreate String als Foreign Key Spalte deklariert mit "FOREIGN KEY(KeySpalte) REFERENCES AndereTabelle(idSpalteDieReferenziertWird)".


    Ebenfalls habe ich mittelerweile in onOpen()
    db.execSQL("PRAGMA foreign_keys = ON;");


    und in OnConfigure
    db.setForeignKeyConstraintsEnabled(true);


    eingefügt aber an dem schien es auch nicht zu liegen.


    Mach ich was grundsätzliches falsch beim Zugriff auf diese Spalten oder sollte der Zugriff gleich verlaufen wie auf andere Spalten?
    Brauch ich spezielle Cursor oder muss ich die Datenbank speziell konfigurieren, dass ich darauf zugreifen kann?


    Wäre echt froh wenn mir jemand helfen könnte. Habe schon Stunden mit Googeln und testen verbracht aber irgendwie find ich nichts brauchbares dazu.

    Benötigt man spezielle Befehle wenn man mit einem Cursor auf die Spalte mit den FOREIGN KEYS zu greifen möchte?


    Wenn ich auf die Spalte mit dem FOREIGN KEY zugreifen möchte mit cursor.getLong(nummerDerKeySpalte) bekomme ich Exception "java.lang.IllegalStateException: Couldn't read row 0, col 5 from CursorWindow.......


    Irgendwie scheint die Spalte gar nicht sichtbar zu sein. Ich kann zur Laufzeit mit keinem gängigen Befehl wie Cursor.getXXX(nummerDerKeySpalte) zu greifen. Ebenfalls wird sie bei Cursor.getColumnCount() nicht mitgezählt.


    Ich hab die Datenbank aus dem Emulator rausgezogen und im "DB Browser for SQLite" angeschaut. Spalten sind alle vorhanden und auch die jeweiligen id Einträge der FOREIGN KEY Spalten stimmen. Also die Datenbank scheint korrekt abgespeichert zu sein nur zugreifen darauf kann ich nicht.


    Ich hab die Spalte auch explizit im OnCreate String als Foreign Key Spalte deklariert mit "FOREIGN KEY(KeySpalte) REFERENCES TabelleDieMitKeyDerReferenziertWird(id)".


    Mach ich was grundsätzliches falsch beim Zugriff auf diese Spalten oder sollte der Zugriff gleich verlaufen wie auf andere Spalten?

    Wie meinst du das, "Die Menge einer Zutat ist ja aber von Rezept und Zutat abhängig und nicht nur von Zutat". Wieso genau würdest die Mengen in eine weitere Tabelle auslagern statt sie zusammen mit den Zutaten zu lassen? Ich versteh das schon so, dass je nach Rezept eine andere Menge der Zutat verwendet wird, aber ich hatte jetzt eigentlich die Idee, eine Zutat könnte mehrmals vorkommen in der Datenbank.


    Deine Idee wäre es demnach, wenn ich das richtig verstehe, einen einzigen Pool an möglichen Zutaten zu besitzen und diesen dann über die Ids und Mengen mit den Rezepten in Beziehung zu setzen? So dass nicht mehrmals eine Zutat in der Datenbank angelegt wird, sondern eine einzige jeder Art, welche dann einfach mehrmals über deren Id referenziert wird?


    Falls du das so meinst klingt das recht interessant und eleganter als meine erst genannte Variante. Stelle mir das auch viel übersichtliche vor so.

    Es stellen sich mir noch ein paar fragen.


    Es wäre ja so das z.b. Jede Zutat für ein Rezept ein Attribut bezüglich dessen Menge beinhalten würde. Also hab ich mir gedacht, dass ich die Zutaten tabellarisch Zeile für Zeile in das Zutaten Table einfüge mit den Spalten Name|Stückzahl|Gewicht|Volumen|.


    _id_zutNameStückzahlGewichtVolumen
    1BEER23
    2BUTTER85
    3EGG6



    Das Problem sehe ich dann beim zusammenführen der beiden Tabellen: Rezepte und Zutaten. Ich hab dann ja pro Rezept ein Eintrag also einen Primarykey währedem ich bei den Zutaten Anzahl Zutaten * Primarykey bekommen.
    Wenn ich nun die ganzen Assoziationen in einer dritten Tabelle abbilden möchte dann hab ich ja drei Spalten |_id_Asso|_id_Rez|_id_Zut|.



    _id_Asso_id_Rez_id_Zut
    111
    212
    313
    414


    Was ich daran ein bisschen unsauber finde ist, dass es mehrere Assoziations IDs pro Rezept geben kann. Lässt sich das irgendwie umgehen oder muss ich damit leben? Ist es evtl gar nicht schlimm? Ich kann mir einfach gut vorstellen das die Verarbeitung und der Zugriff mittels Cursor leichter wäre wen man eine einzige _id_Asso besitzt. Aber das ist momentan auch eher nur eine Vermutung.


    Ich hab deswegen noch nach andere Möglichkeiten gesucht aber auch diese erscheinen mir nicht sonderlich besser.
    Eine davon ist in der Zutaten Tabelle einfach pro Zeile immer pro Spalte eine Zutat einfügen, so dass alle Zutaten eines Rezepts auf einer Spalte wären (quasi ein Zeilenvektor bilden).


    _id_ZutZutatZutatZutat
    1BEERBUTTEREGG



    So hätte ich zumindest für die Zutaten eine einzige ID und nicht mehrere. Ein Nachteil wäre aber, dass die Spaltenzahl (oder Länge dieses Zeilenvektros) je nach Anzahl Zutaten variieren kann und ich nicht weiss wie flexibel man Spalteneinträge dynamisch erweitern kann oder ob man nur in vordefinierten Spalten Einträge ablegen kann.


    Hinzu kommt aber auch hier wieder das Problem mit den Mengen. Wie und wo bilde ich diese am schlausten ab. Ich kann diese ja nicht in der gleichen Struktur (als Zeilenvektor) in eine Tabelle legen wie die vorher erwähnten Zutaten. Da eine Zutaten entweder als Stück, über das Gewicht oder als Volumen definiert werden müsste ich entweder die Spaltenanzahl verdreifachen


    _id_ZutStückzahlGewichtVolumenStückzahlGewichtVolumenStückzahlGewichtVolumen
    123856



    oder die Spalten Namen Dynamisch ändern, was aber wiederum nicht funktionieren würde für zukünftige Zutaten, weil diese ja möglicher weise wieder anders definiert sind.


    Es gäbe schon eine Möglichkeit dieselbe Struktur zu nutzen, dann müsste ich aber jeder Zutate noch die Zusatz Information geben ob es sich um eine Stückeinheit,Flüssigkeit oder Fesstoff handelt. Diese Lösung würde dann wieder eine zusätzliche Tabelle benötigen was mir dann schon recht komplex erscheint für eine eigentliche simple Abbildung von Daten. Ich wäre froh wenn mir da jemand mit Erfahrung seine Sicht der Dinge und Ideen näher bringen könnte bevor ich in eine Richtung los laufe und merke, dass ich in einer Sackgasse angekommen bin.

    Diese Primärschlüssel sind die ids von Datenbankeinträgen oder? Also die jeweils erste Zelle eines Eintrags? Die bleiben ja dann immer gleich wenn ich mich recht erinnere sonst würds ja wohl nicht gehen. Und sind nur innerhalb eines .db Files einzigartig also nicht über die ganze Applikation? Dann müsste ich wenn ich das jetzt richtig verstehe eine Datenbank anlegen database.db und dort drin dann die drei von dir vorgeschlagenen Tables A,B,C und nicht A.db B.db C.db als einzelne Datenbank?

    Ich frage mich gerade ob es möglich ist eine Datenbank anzulegen deren Einträge wieder eine Datenbank sind.


    Folgende Situation:
    Es gibt zum einen Rezepte die man in einer Datenbank ablegen möchte. Dies sollen neben normalen String und Zahlen Werten auch Zutaten beinhalten.
    Gesucht ist eine saubere Lösung mit welcher ich einfach auf die Zutaten der Rezepte zugreifen kann und diese gegebenenfalls leicht manipulieren könnte.


    Lösungsansatz:
    Ich habe mich gefragt, ob es nicht am meisten Sinn machen würde, wenn man in einer Spalte in einem Datenbank Eintrag eines Rezepts einen String anlegen würde zutaten.db. Zutaten.db wäre dann der Dateiname der Datenbank welche die Zutaten beinhaltet. Ich fände diese Lösung sauberer als die Zutaten direkt in die Rezept Datenbank zu legen da so jeder Eintrag eines Rezepts immer gleich Aufgebaut wäre bezüglich Spaltenanzahl und deren Inhalt.


    Nun weiss ich aber nicht ob es in SQLite einfacher Wege gibt so etwas zu bewerkstelligen oder was in diesem Bereich "State of the Art" ist. Kann mir jemand mit Erfahrung in dem Bereich mal seine Sicht der Dinge präsentieren?
    Wie wird sowas überlicherweise gemacht? Vor- und Nachteile? Hilfsfunktionen in SQLite?

    Hab die ganze Speicherung der Daten jetzt umgebaut und mit SQLite Datenbanken erstellt. Musste mich zwar erstmal ein paar Stunden schlau machen darüber und einiges umprogrammieren aber ist sicherlich die sauberste Lösung wie es mir scheint. Die besagten Probleme treten nun nicht mehr auf. Vielen Dank für den Tipp!

    Das hab ich mir auch überlegt und kurz etwas zu MySQL gelesen. Kommt das denn schlussendlich nicht auf das selbe hinaus wie wenn ich Objekte in .txt Files speichere.


    Ich muss dann ja auch immer die einzelnen Attribute aus der Datenbank ziehen und mir dann wieder neue Objekte zusammenbasteln die ich in die Listen ablegen kann. Oder versteh ich das falsch? Eine Art Datenbank Manager hab ich auch schon in den jeweiligen Java-Klassen codiert. Also alle Methoden zu bestimmten Manipulationen der Listen benötigt würden sind bereits vorhanden.


    Gibt es denn spezielle Vorteile die mir eine Datenbank sonst noch bieten könnte abgesehen vom Manager bzw. Gründe warum man sie vorziehen sollte? Wie bereits angesprochen müsste ich ja aus den Daten trotzdem wieder Objekte generieren um sie Beispielsweise mittels eines Listview-Adapters in einem Listview darzustellen.


    Gibt es Datenbanken, welche nicht nur die Attribute als Zahlenwerte oder Strings abspeichern, sondern ganze Java Objekte speichern können? Ich hab da irgendwie nichts schlaues gefunden bis jetzt.

    Folgende Situation:
    Ihr habt mehrere Listen die Objekte beinhalten. Diese Listen werden von gewissen Activities um Objekte erweitert oder verändert.
    Startpunkt ist die MainActivity wo zuerst einmal die Listen sowie die Objekte, die der Liste hinzugefügt werden können, instantziert werden.
    Nun gibt es mehrere Activities die man von dort aus ansteuern kann. Es gibt solche die die besagten Listen bloss anzeigen. In anderen Activities kann man Objekte wählen die der Liste mit entsprechenden Attributen hinzugefügt werden können.


    Ziel:
    Das User Interface sollte möglichst flexibel sein, so dass man rasch zwischen den Activities hin und her wechseln kann und nicht immer zur Main Activity zurück gehen muss.


    Ich habe festgestellt, dass es ein ziemlicher Aufwand ist die ganzen Objekte und Listen immer von Activity zu Activity schicken und darauf zu achten dass diese auch stets aktuell sind. Vor allem wenn man die Zurück Taste betätigt können böse Überraschungen geschehen, da man dann dummerweise nicht die aktuellsten Daten weiter gibt. Ich möchte euch nicht zu sehr mit Details belästigen meine Frage ist eher grundsätzlicher Natur:


    Macht es Sinn die ganze Zeit Daten über Intents hin und her zu verschieben, wenn man eine flexible Struktur der App haben möchte oder macht es mehr Sinn die Objekte vor Activity Wechseln zwischen zu speichern und in der neuen Activity wieder zu laden?
    Was sind Vor- und Nachteile von beiden Vorgehen?
    Auf was sollte man achten?
    Was ist der Standard bei der Entwicklung?


    So wie ich das verstanden habe werden ja auch nicht wirklich die Objekte verschoben sondern bloss die Referenzen auf diese. Wenn man also viele Daten über Intents sendet sollte es Performance technisch zumindest stabiler und schneller sein als wenn ich oft Speicher- und Ladevorgänge habe?

    Danke für deine Antwort. Werde das sicher mal ausprobieren.


    Ich habe jetzt eine andere Möglichkeit gefunden, die eigentlich naheliegend war aber meiner Meinung nach irgendwie nicht sauber oder zumindest sicher nicht effizient ist :)


    Ich habe vorher im gleichen Verzeichnis wie die MainActivity ist ein neues Paket definiert und dort die Klassen (.Java-Files) rein kopiert. Das hat Android Studio aber irgendwie nicht gefressen. Ich konnte auch mit dem richtigen Paket Import nicht auf die Klassen zugreifen. Lediglich Klassen die ich über New->Class generiert habe, konnte ich in MainActivity nutzen. Ich habe nun also alle meine Klassen nochmals neu definiert im Paket und einfach über Copy-Paste den Source-Code aus dem Editor von Eclipse rein kopiert. So konnte ich auf die erstellten Klassen zugreifen aus der MainActivity.


    Ich weiss nicht ob Android Studio im Hintergrund noch zusätzliche Operationen durchführt oder Verknüpfungen erstellt so dass ein einfaches rein kopieren der Files nicht funktioniert.


    Was ich ausserdem noch festgestellt habe ist, dass ich die Default Methoden der Interfaces nicht mehr nutzen kann da Android anscheinend noch nicht Java8 unterstützt. Ich könnte mir deshalb gut vorstellen, dass der anfangs beschriebene Ablauf zur Erzeugung eines Moduls durchaus korrekt ist und es bei mir zur Fehlermeldung kam wegen den Default Methoden des Interfaces. Ich meinte mich sogar daran zu erinnern das er genau beim kompilieren eines solchen Interfaces mit der Fehlermeldung kam.

    Hallo zusammen


    Folgende Situation:


    Ich besitze bereits ein auf dem PC lauffähiges Java-Projekt in Eclipse und möchte nun die Klassen davon für eine Android App verwenden. Meine Idee war es die Klassen als eine zusätzliche Library in das Projekt einzubinden.


    Das Problem an der ganzen Sache ist aber, dass ich nicht weiss wie man das auf eine korrekte Art in Android Studio macht. Ich habe bereits im Netz danach gesucht und erfuhr, dass man über File->New->New Module->Java Library ein neues Modul machen könnte. Dort drin wird auch Standardmässig gerade eine MyClass.class Datei erzeugt. Danach müsste man nur noch unter File->Project Structure-> bei Modules auf app->Dependencies-> grünes +-> und dann das erstellte Modul auswählen. In das Paket des Ordners könnte man dann seine Klassen kopieren und auch neue Packages machen wurde weiter beschrieben.


    Ich hab dann in der onCreate() Methode zu Testzwecken ein Objekt vom Typ MyClass erzeugt. Im Editor scheint er ohne Probleme das Package mit samt der Class importieren zu können. Nur wenn ich dann das Ding kompilieren möchte, um es im Emulator zu testen, bekomme ich folgenden Fehler:



    Error:Execution failed for task ':app:preDexDebug'.
    > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 1


    Ist das oben beschriebene Vorgehen überhaupt korrekt? Falls nicht wie importiere ich korrekte meine .class Files? Falls ja wir kriege ich diesen Error weg.


    Ich wäre euch wirklich sehr dankbar wenn ihr mir helfen könnten ich suche schon Stunden nach Lösungen und komme einfach nicht weiter ||