2016-05-12 31 views
1

Für meine App versuche ich Highscores in einer Datenbank zu speichern, die auf meinem Android-Gerät namens "highscores.db" gespeichert ist. Jetzt habe ich ein Problem, dass die MySQL keine Zeilen an al zurückgibt, so würde ich vermuten, dass entweder meine Einfügung falsch geht oder mein Abrufvorgang läuft. Ich habe überhaupt keine Ahnung, was falsch ist (zum ersten Mal sqlite user).SQLite db gibt keine Zeilen zurück

DBHandler.java

public class DBHandler extends SQLiteOpenHelper { 
private static final int DATABASE_VERSION = 3; 
private static final String DATABASE_NAME = "highscores.db"; 
public static final String TABLE_HIGHSCORES = "highscores"; 
public static final String COLUMN_WAVE = "wave"; 
public static final String COLUMN_MONEY = "money"; 
public static final String COUKN_ZOMBIEKILL = "zombiekill"; 

public DBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
    super(context, name, factory, version); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String query = "CREATE TABLE " + TABLE_HIGHSCORES + "(" + COLUMN_WAVE + " INTEGER, " + 
      COLUMN_MONEY + " DOUBLE, " + 
      COUKN_ZOMBIEKILL + " INTEGER " + ")"; 
    db.execSQL(query); 
} 

//Upgrade db 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_HIGHSCORES); 
    onCreate(db); 
} 

//add new row 
public boolean addHighScore(Highscore highscore) { 
    ContentValues values = new ContentValues(); 
    values.put(COLUMN_WAVE, highscore.getWave()); 
    values.put(COLUMN_MONEY, highscore.getMoneyLeftOver()); 
    values.put(COUKN_ZOMBIEKILL, highscore.getZombiekill()); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    long result = db.insert(TABLE_HIGHSCORES, null, values); 
    if(result == -1){ 
     return false; 
    }else{ 
     return true; 
    } 
} 

//Get database info 
public ArrayList<Highscore> getHighScores(){ 
    SQLiteDatabase db = getWritableDatabase(); 
    String query = "SELECT * FROM highscores"; 

    int wave = 0; 
    double money = 0; 
    int zombiekill = 0; 
    Highscore hs = null; 
    ArrayList<Highscore> highscores = new ArrayList<>(); 
    Cursor c = db.rawQuery(query,null); 
    c.moveToFirst(); 

    while(c.moveToNext()){ 
     if(c.getString(c.getColumnIndex("wave")) != null){ 
      wave = Integer.parseInt(c.getString(c.getColumnIndex("wave"))); 
     } 
     if(c.getString(c.getColumnIndex("money")) != null){ 
      money = Integer.parseInt(c.getString(c.getColumnIndex("money"))); 
     } 
     if(c.getString(c.getColumnIndex("zombiekill")) != null){ 
      zombiekill = Integer.parseInt(c.getString(c.getColumnIndex("zombiekill"))); 
     } 
     hs = new Highscore(wave,money,zombiekill); 
     highscores.add(hs); 
    } 

    db.close(); 
    return highscores; 
} 

}

Auch ich weiß nicht, wo diese Datenbank zu sehen, ob zu überprüfen oder nicht gefüllt wird. Viele geben eine Erklärung, wo es gefunden werden kann, aber ich weiß nicht, wie ich dorthin komme.

~ Vielen Dank im Voraus

EDIT1.0 public Arraylist getHighScores geändert()

public ArrayList<Highscore> getHighScores(){ 
    SQLiteDatabase db = getWritableDatabase(); 
    String query = "SELECT * FROM highscores"; 

    int wave = 0; 
    double money = 0; 
    int zombiekill = 0; 
    Highscore hs = null; 
    ArrayList<Highscore> highscores = new ArrayList<>(); 
    Cursor c = db.rawQuery(query,null); 
    c.moveToFirst(); 

    while(!c.isAfterLast()){ 
     if(c.getString(c.getColumnIndex("wave")) != null){ 
      wave = Integer.parseInt(c.getString(c.getColumnIndex("wave"))); 
     } 
     if(c.getString(c.getColumnIndex("money")) != null){ 
      money = Integer.parseInt(c.getString(c.getColumnIndex("money"))); 
     } 
     if(c.getString(c.getColumnIndex("zombiekill")) != null){ 
      zombiekill = Integer.parseInt(c.getString(c.getColumnIndex("zombiekill"))); 
     } 
     hs = new Highscore(wave,money,zombiekill); 
     highscores.add(hs); 
     c.moveToNext(); 
    } 

    db.close(); 
    return highscores; 
} 

Immer noch nicht

EDIT2.0 arbeiten: Dies ist im wie Handhabung

DBHandler handler = new DBHandler(getApplicationContext(),null,null,1); 
    for (int i = 0; i < 5; i++) { 
     handler.addHighScore(new Highscore(10,30,55)); 
    } 
Spar

das ist, wie im Abrufen auf andere Datei:

DBHandler handler = new DBHandler(getActivity().getApplicationContext(), null, null, 1); 
    HighScoreSingleton.getInstance().setHighscores(handler.getHighScores()); 
+0

Wie viele Zeilen du hinzugefügt hast .. Wenn du nur eine Zeile hinzugefügt hast .. Wie du den Aufruf von movetext nimmst, erhältst du keine Daten. – Sush

+0

Ihr Code funktioniert richtig, ich habe Ihre Methoden kopiert und kann die Werte abrufen. Ihr Problem ist, wie Sie diese Methoden verwenden. Überprüfen Sie, ob Sie die Highscore-Daten außerhalb dieser Klasse korrekt verarbeiten. –

+0

verwaltet, um es zu beheben – Ellisan

Antwort

0

Dank Benjamín Molina fand ich, dass ich die Ausgabe falsch behandelt habe.

Ich musste nur die Handhabung des Codes aktualisieren. Aktualisieren Sie, importieren und wählen Sie in derselben Java-Klasse oder erstellen Sie ein Singleton, das die Instanz des Aufrufs zum dbhandler verfolgt.

DBHandler handler = new DBHandler(getActivity().getApplicationContext(), null, null, 1); 
    for (int i = 0; i < 5; i++) { 
     handler.addHighScore(new Highscore(10,30,55)); 
    } 

    HighScoreSingleton.getInstance().setHighscores(handler.getHighScores()); 

Allerdings fand ich immer noch, dass, wenn ich die App schließen und neu starten, ohne vorher neue Daten in die db Hinzufügen alle Daten verloren gehen, wie rufe ich, dass Daten aus einem früheren gemacht db.

Verwandte Themen