SQLite Datenbank Problem

  • Hallo, ich möchte zu einem Spiel eine Highscore Liste anlegen mit einer Datenbank.


    Name und score werden an ein Intent angehängt und an eine neue Activity übergeben. Diese sieht folgendermaßen aus:




    Allerdings startet die neue Activity nicht und ich bekomme folgende Fehlermeldungen



    06-30 13:17:07.080: E/AndroidRuntime(1742): FATAL EXCEPTION: main
    06-30 13:17:07.080: E/AndroidRuntime(1742): java.lang.RuntimeException: Unable to start activity ComponentInfo{thomas.schneider/thomas.schneider.Highscore}: java.lang.NullPointerException
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.ActivityThread.access$600(ActivityThread.java:130)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.os.Handler.dispatchMessage(Handler.java:99)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.os.Looper.loop(Looper.java:137)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.ActivityThread.main(ActivityThread.java:4745)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at java.lang.reflect.Method.invokeNative(Native Method)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at java.lang.reflect.Method.invoke(Method.java:511)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at dalvik.system.NativeStart.main(Native Method)
    06-30 13:17:07.080: E/AndroidRuntime(1742): Caused by: java.lang.NullPointerException
    06-30 13:17:07.080: E/AndroidRuntime(1742): at thomas.schneider.Highscore.onCreate(Highscore.java:41)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.Activity.performCreate(Activity.java:5008)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    06-30 13:17:07.080: E/AndroidRuntime(1742): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)



    Kann jemand helfen?

  • Du öffnest die Datenbank in der OnCreate nicht ;)
    Dann läuft es natürlich auf eine NullpointerExeption raus ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • HAb nochmal ne kleine Frage dazu.


    Folgendermaßen hole ich mich mir meine Daten aus der Datenbank und möchte sie nach nem Score ordnen lassen.


    Java
    db.query(DATABASE_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_SCORE },
    				null, null, null, null, KEY_SCORE);



    Danach speichere ich das ganze als String in ne ArrayList und lasse es mir per ListView anzeigen.
    Klappt soweit auch sehr gut allerdings wird mir das ganze nicht richtig geordnet. Statt z.B 12,9,8,5,4,3,1,1 ordnet er mir folgermaßen: 9,8,5,4,3,1,12,1,1,....


    Wie kann ich das denn ändern?

  • Eine Datenbankabfrage lässt sich sehr einfach sortieren.
    Dazu bietet SQL "Order by" an, was auch Android unterstützt ;)
    http://www.1keydata.com/de/sql/sql-order-by.php


    z.B.:

    Code
    ORDER BY SCORE DESC

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Das ist mir schon bewusst, der letzte Eintrag im query bezieht sich doch auf Order By oder nicht?


    Ändert aber leider nichts an meinem Problem. Er sortiert mir immer noch 9,8,...,2,12,1,.. anstatt 12,9,8,... Ist auch egal ob ASC oder DESC, in beide richtungen das selbe...

  • In solchen Fällen hasse ich ja die Methodenüberladung von Java. +grummel+

    Java
    db.query(DATABASE_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_SCORE },
    				null, null, null, null, KEY_SCORE);


    Jetzt muss man erst mal ne halbe Stunde rumüberlegen, ob das die richtige Methode ist...

    Java
    query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)


    Ja, sieht richtig aus.


    Was meinst du mit 'ASC und DESC bring auch nix'?


    Nur 'KEY_SCORE' sagt ja erst mal noch nichts aus, da die Richtung fehlt.
    KEY_SCORE + " ASC" wäre vielleicht besser.

    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!«

  • KEY_SCORE+ " ASC" hab ich schon probiert und KEY_SCORE+ " DESC" hab ich auch probiert.


    Beide male leider keine Änderung bei der Sortierung, nur eben einmal absteigend und einmal aufsteigend.



    Bin grad etwas ratlos weil am resltichen Code kann es ja eigentlich nicht liegen. Score und Name stehen korrekt in der Datenbank, werden richtig ausgelesen, nur die Sortierung passt eben nicht...

  • Kann es sein, dass dein Score-Feld ein Textfeld ist?


    Dann wäre "2" nämlich größer als "12" und "12" größer als "111"...

    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!«

  • Hmm, ich habe in meiner Highscore Activity 'int' score und 'String Name'


    Highscores füge ich folgendrmaßen hinzu. Hier übergebe ich dann obige Werte...


    Java
    public long addHighscore(String name_, int score_) {
    		ContentValues values = new ContentValues();		
    		values.put(KEY_NAME, name_);
    		values.put(KEY_SCORE, score_);
    		return db.insert(DATABASE_TABLE, null, values);
    	}



    Und mein execSQL sieht folgendermaßen aus:

    Java
    private static final String DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + " ("+ KEY_ID + " INTEGER PRIMARY KEY, " + KEY_NAME
    				   + " VARCHAR, " + KEY_SCORE + " INT)";
  • Hast du schonmal execsql versucht?http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Das ist seltsam, denn die von dir beschriebene Sortierung ist eine 1a Zeichenkettensortierung.
    Hast du die Tabelle zu Testzwecken mal weggeschmissen und neu erstellt?

    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!«

Jetzt mitmachen!

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