BMI in Datenbank speichern

  • Hallo allerseits!


    Ich habe aktuell ein Projekt (BMI App), aber komme momentan nicht weiter. Ich schlage mich bereits eine Woche mit dem Problem rum und würde es jetzt gerne endlich beenden. Folgendes Problem: Die App soll eine Zahl (den BMI) in der SQLite Datenbank speichern und sie in die ListView eintragen. Ich weiß einfach nicht wo das Problem liegt! :(


    Ich habe nach einem folgendem Tutorial gearbeitet:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Darin ging es um fast das Selbe(es wurden nur merhere Daten in die SQLite Datenbank eingetragen).


    Wenn ich die App auf dem Emulator laufen lasse wird immer in einem Toast "no such table... Select ID, BMI from BMIVerlauf " angezeigt. Den Eintrag von Logcat habe ich als Anhang beigefügt.


    Ich hoffe mir kann jemand helfen. Ich poste auch gerne den Quellcode, falls notwendig.


    Liebe Grüße,


    Henrik

  • Na aber das Problem steht doch in deinem Log File - er findet die Tabelle nicht,
    jetzt musst du mal deinen Source durchsuchen ob du eventl Gross/Kleinschreibung oder sonst etwas durcheinander gebracht hast - kann mir nur vorstellen das es so etwas triviales ist.


    Spannend finde ich aber noch die Ausgabe in deinem Log.


    Zitat

    03-12 16:51:08.247: I/Choreographer(853): Skipped 52 frames! The application may be doing too much work on its main thread.


    Wenn es mit dem Fehler zusammenhängt ok, falls die DB Abfrage immer so lange dauert, solltest du Sie in einen extra Thread verlagern weil sonst der Mainthread (GUI) zum Stillstand kommt und deine App abstürzt -> ANR Error.

  • Danke schonmal!


    Entry.java:


    MySQLiteHelper.java:


    VerlaufDataSource:

  • Jemand mag mich korrigieren aber ich dachte das ID Feld bei sqlite sollte immer zwingend _id heissen, alles andere sorgt für Probleme (da gibt es hier irgendwo auch einen Thread zu)



    Ok noch mal gesucht und gefunden, die Probleme kommen dann in Verbindung mit CursorAdapter bzw Listview. nachzu lesen hier


    http://developer.android.com/r…widget/CursorAdapter.html


    Zitat

    Adapter that exposes data from a Cursor to a ListView widget. The Cursor must include a column named "_id" or this class will not work.



    Hier mal noch ein gutes Tutorial zum Thema SQLite bzw auch für die Zukunft Contentprovider


    http://www.vogella.com/articles/AndroidSQLite/article.html



    ------------------------------------------------------------------------------------------------------------------------
    Fehler:


    Zitat

    db.execSQL("DROP TABLE IF EXISTS SCANITEM");


    Deine Table heisst nicht SCANITEM --> die heisst BMIVERLAUF

  • Hallo Henry, dann zeig doch mal deine Mainactivity wo du die Datenbank initalisierst,


    ich habe hier eben mal deinen Code 1zu1 kopiert (bis auf die DROP Anweisung) und zu einem Testprojekt gemacht, habe mit createEntry Einträge hinzugefügt und mit getAllEntries alle wieder zurückgeben lassen alles ohne Fehler. (sogar mit dem unveränderten ID gedöns)



    Also bei mir sieht das "Testprojekt" oncreate so aus


  • Ich nutze für derartigen Kram ja lieber ORM Tools wie greendao, weil mir das Datenbankgefrickel echt zu mühsam ist.
    (Erinnert mich daran, dass ich immer noch mal einen ‚Lexikon–Eintrag‘ dazu tippen wollte...)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Mag in deinem Fall ja das richtige Mittel der Wahl sein, war hier aber leider nicht gefragt.


    So wie ich die Sachlage sehe steht Henry gerade am Anfang seiner Androidprogrammiererlaufbahn (siehe erstes Posting mit Verweis -> Tutorial) und daher denke ich sollte man Ihn jetzt nicht mit irgendwelchen Hilfskonzepten und Librarys überrollen, sondern erst mal bei den Grundlagen helfen und die heissen in diesem Falle SQLite und sind mit reinen Bordmitteln zu erledigen.


    Wenn er das verstanden hat, kann er sich ja gerne ORM Lite, greendao und wie Sie alle heissen anschauen.

  • So sieht´s aus ;) Hab vor ein paar Monaten angefangen und wollte jetzt mein erstes größeres Projekt voll durchziehen.
    Hier die entsprechenden Stellen in der welcome.java Datei:

    Java
    @Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_welcome);
    		datasource= new VerlaufDataSource(this);
    	}
    	private VerlaufDataSource datasource;
    	List<Entry> BMIList = new ArrayList<Entry>();


    Java
    FeldBMI.setText(String.format("%.2f", BMI)); //maximal 2 Nachkommastellen
    		try {
            	datasource.open();
            	datasource.createEntry(BMI);
            	datasource.close();
            	}
            	catch (Exception ex) {
            		Toast.makeText(this,ex.toString(), Toast.LENGTH_LONG).show();
            	}


  • Mag in deinem Fall ja das richtige Mittel der Wahl sein, war hier aber leider nicht gefragt.


    Ansichtssache. ;)


    [...]sondern erst mal bei den Grundlagen helfen und die heissen in diesem Falle SQLite und sind mit reinen Bordmitteln zu erledigen.


    Die Sache sehe ich ganz genau so.
    Allerdings gab ich ihm hier den Tipp, sich doch mal durch das androideigene Grundlagentraining zum Thema SQLite Datenbanken zu arbeiten.


    Statt dessen wird eines der unzähligen und mutmaßlich qualitativ nicht besonders hochwertigen Online-Tutorials genutzt, die alles tun – außer Grundlagen zu vermitteln.


    So wie ich die Sachlage sehe steht Henry gerade am Anfang seiner Androidprogrammiererlaufbahn (siehe erstes Posting mit Verweis -> Tutorial) und daher denke ich sollte man Ihn jetzt nicht mit irgendwelchen Hilfskonzepten und Librarys überrollen [...]
    Wenn er das verstanden hat, kann er sich ja gerne ORM Lite, greendao und wie Sie alle heissen anschauen.


    Diese Sichtweise überrascht mich. Wann immer nach irgend einer Lösung für sein spezifisches Problem gefragt wird, bekommt man irgend eine Library empfohlen. Der ganze Programmierkrams läuft nur mit Libraries. Man hat es eigentlich immer mit Libraries zu tun. Warum dann für den Anfang nicht erst mal eine Library nutzen, die einem unnötige Arbeit abnimmt?


    Mein persönliches Problem mit diesen 'SQLite Grundlagen' ist einfach das Folgende: man will eine objektorientierte Programmiersprache lernen und bekommt dann Hilfskonstrukte an die Hand gegeben, mit denen man prozedural logisch gespeicherte Datenstrukturen mit einem Objekt abgreift.
    Hier wird das Objekt (der Cursor) eigentlich nur um eine Datenstruktur gekapselt, die Bearbeitung läuft dennoch stur nach Schema F der struktularen Programmierung ab: Position 1, Position 2, Position 3, Position 4...
    Auch wenn Dinge wie .hasNext() helfen Exceptions vorzubeugen, ist doch das gesamte Konzept irgendwie skurril. Hat was von Binärdaten als HEX-String zu übergeben. Kann man machen, machen viele, ist aber nicht das Sinnvollste.


    Wesentlich logischer wäre es doch, wenn man die ganze Zeit durch mit Objekten arbeitet.
    In dem Fall hätte man eine ArrayList<BMI> an den ListAdapter gehängt, würde via item.getIndex() den BMI, via item.getMass() das Gewicht in Kilogramm und via item.getHeight() die Größe zurückbekommen und müsste sich einen Dreck um die Art der Speicherung kümmern.
    Abstraktion und Kapselung ‚at it's best‘.


    Wenn man dann Bock bekommen hat, richtig schöne Dinge direkt in der Datenbank zu machen, kann man sich damit immer noch beschäftigen. Das Verständnis für die Konzepte hinter den Cursorn und Adaptern dürfte dann auch weit genug fortgeschritten sein, um das alles bis ins Kleinste auszureizen.


    Für ‚Ich möchte einen Schwung von Ziffern persistieren.‘ halte ich persönlich
    „Beschäftige dich ausführlich mit insgesamt drei unterschiedlichen Konzepten, die du für einen anderen Anwendungsfall eigentlich gar nicht brauchst, und pack es in eine SQLite Datenbank.“
    für weit weniger hilfreich als
    „Dann kümmere dich mal um das Einbinden einer fremden Library, baue etwas Setup-Code nach und benutze es anschließend wie ein gewöhnliches Objekt."


    Gerade in der Welt von Android, in der es für wirklich jeden Pups mindestens drei Libraries gibt, halte ich das Vereinfachen von derartigen Vorgängen für überaus sinnvoll. Gerade am Anfang!

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Das du schon in Tutorialvorleistung gegangen bist, hatte ich gar nicht gesehen... na dann kann man dann nur "Zurück zur Schulbank" sagen.


    Zitat


    Diese Sichtweise überrascht mich. Wann immer nach irgend einer Lösung für sein spezifisches Problem gefragt wird, bekommt man irgend eine Library empfohlen. Der ganze Programmierkrams läuft nur mit Libraries. Man hat es eigentlich immer mit Libraries zu tun. Warum dann für den Anfang nicht erst mal eine Library nutzen, die einem unnötige Arbeit abnimmt?



    Wie soll ein Anfänger greendao verstehen bzw. die Vorteile erkennen wenn Ihm die Grundlagen/Basics zu SqLite fehlen ? Natürlich wird das jetzt für einen Aussenstehenden klarer nach dem er deine Abhandlung gelesen hat. (aber erst jetzt, also hinterher).
    Somit wäre dein komplett objektorientierter Ansatz die perfekte Lösung, doch darfst du nicht den Fehler machen und davon ausgehen das 90% der Leser dieses Forums ein abgeschlossenes Informatikstudium haben (dann wär dieses Forum fast so überflüssig wie ein Kropf). Also woher soll der Leser wissen das so etwas möglich ist ??? (du hast ja deinen Lexikoneintrag noch nicht gemacht und hälst somit wertvolles Wissen zurück :) )


    In vielen Büchern/Tutorials werden halt nur die Basics abgeklappert und tiefergehende Erklärungen zu DesignPatterns, MVC und Co. werden meist gar nicht behandelt, daher denke ich mir man sollte nicht allzu hart mit den Anfängern ins Gericht gehen.

Jetzt mitmachen!

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