2014-02-26 12 views
7

Ich versuche eine Score-Datenbank zu erstellen, die die Punktzahl der Spieler um eins erhöht, wenn sie gewinnen, indem sie updateScore() aufrufen. Der Primärschlüssel und die Spielernummer sind identisch (ich muss vielleicht die Datenbank irgendwann neu strukturieren) und die letzte Spalte ist "Score".Android SQLite inkrementiert einen Spaltenwert

Unten ist der Code, der anfänglich die Partitur setzt (das funktioniert), die Methode, die die Partitur erhält (funktioniert auch gut) und die Methode, die die Partitur aktualisiert, erhöhen die relevanten Spieler Punkte um 1. Dies ist der Teil der geht nicht, soll ich hier etwas anders machen? Vielen Dank.

 /** Add a record to the database of two player scores 
    * @param playerId 
    * @param playerScore 
    **/ 
    public void addScore (int playerId, int playerScore) { 

     SQLiteDatabase database = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(ID, playerId); 
     values.put(PLAYERNUM, playerId); 
     values.put(SCORE, playerScore); 

     database.insert(TABLE_2PSCORES, null, values); 

     database.close(); 

    } 


    // Get the score 
    public int getScore (int playerId) { 
     SQLiteDatabase database = this.getReadableDatabase(); 

     Cursor cursor = database.query(TABLE_2PSCORES, COLUMNS, " player = ?", new String[] {String.valueOf(playerId) }, null, null, null, null); //null = groupby, having, orderby, limit 

     if (cursor !=null) { cursor.moveToFirst(); } 

     int output = cursor.getInt(2); 

     return output; 
    } 


    // Increment score by 1 
    public void updateScore (int playerId) { 

     SQLiteDatabase database = this.getWritableDatabase(); 

     int playerScore = getScore(playerId); 
     int playerScoreInc = playerScore ++; 

     ContentValues values = new ContentValues(); 
     values.put("score", playerScoreInc); 

     database.update(TABLE_2PSCORES, values, PLAYERNUM+" = ?", new String[] {String.valueOf(playerId)}); 

     database.close(); 

    } 
+0

Verwandte Frage: http://stackoverflow.com/questions/9798473/sqlite-in-android-how-to-update-a-specific-row – reinierpost

+0

Schauen Sie sich diese Frage an. http://stackoverflow.com/questions/744289/sqlite-increase-value-by-a-certain-number –

+0

schließen Cursors nach dem Gebrauch, besser Programmierpraxis – Jaydev

Antwort

3

ändern

int playerScoreInc = playerScore ++; 

zu

int playerScoreInc = ++ playerScore; 
0

Haben Sie versucht das Debuggen? Versuchen Sie, diese Zeile zu debuggen:

int playerScoreInc = playerScore ++; 

Die playerScoreInc wird nicht inkrementiert.

+0

Danke für die Antwort, ich hatte müde Debugging, aber nichts bekommen sinnvoll. Ich habe jetzt die Antwort. – davidbain

+0

Wenn Sie diese Codezeile, die ich kopiert habe, bereinigt haben, wäre der Wert nicht inkrementiert worden. Dann hättest du die Antwort leicht selbst gefunden :) – Pavenhimself

9
int playerScoreInc = playerScore ++; 

Ordnet playerScore zu playerScoreInc und erst danach erhöht playerScore. Um zuerst zu erhöhen und dann zuzuweisen, wechseln Sie zu ++playerScore.

Sie können jedoch alles in SQL tun, keine Notwendigkeit Punktzahl zu holen, es im Code erhöht und dann die Datenbanktabelle separat zu aktualisieren:

database.execSQL("UPDATE " + TABLE_2PSCORES + " SET " + SCORE + "=" + SCORE + "+1" + " WHERE " + PLAYERNUM + "=?", 
    new String[] { String.valueOf(playerId) }); 
2

Ich denke, das wird funktionieren

// Increment score by 1 
    public void updateScore (int playerId) { 

     SQLiteDatabase database = this.getWritableDatabase(); 

     int playerScore = getScore(playerId); 
     int playerScoreInc = ++ playerScore; 

     ContentValues values = new ContentValues(); 
     values.put("score", playerScoreInc); 

     database.update(TABLE_2PSCORES, values, PLAYERNUM+" = ?", new String[] {String.valueOf(playerId)}); 

     database.close(); 

    } 
+0

Danke für die Antwort. Ein paar Antworten beziehen sich auf den ++ Player-Kern über Playerscore ++, und das hat mein Problem behoben. Danke noch einmal! – davidbain

+0

Die ++ var bedeuten Inkrement vor der Zuweisung und das val ++ bedeutet Inkrement nach dieser Zuweisung. Deshalb wurde es nicht für Sie aktualisiert. –

5

Die anderen Antworten lösen die ursprüngliche Frage, aber die Syntax macht es schwer zu verstehen. Dies ist eine allgemeinere Antwort für zukünftige Zuschauer.

Wie eine SQLite-Spaltenwert

SQLite

Die allgemeine SQLite Syntax ist

UPDATE {Table} SET {Column} = {Column} + {Value} WHERE {Condition} 

Ein Beispiel hierfür ist

UPDATE Products SET Price = Price + 1 WHERE ProductID = 50 

(Credits zu erhöhen, um this answer)

Android

Nun, da die allgemeine Syntax klar ist, lassen Sie mich das in Android-Syntax übersetzen.

private static final String PRODUCTS_TABLE = "Products"; 
private static final String ID = "ProductID"; 
private static final String PRICE = "Price"; 

String valueToIncrementBy = "1"; 
String productId = "50"; 
String[] bindingArgs = new String[]{ valueToIncrementBy, productId }; 

SQLiteDatabase db = helper.getWritableDatabase(); 
db.execSQL("UPDATE " + PRODUCTS_TABLE + 
     " SET " + PRICE + " = " + PRICE + " + ?" + 
     " WHERE " + ID + " = ?", 
     bindingArgs); 
db.close(); 

ERLEDIGEN

Diese Antwort sollte update statt execSQL verwenden aktualisiert werden. Siehe Kommentar unten.

+0

Die Android-Dokumentation sagt: Führe eine einzelne SQL-Anweisung aus, die KEINE SELECT/INSERT/UPDATE/DELETE ist. Das Problem ist, dass execSql (..) nicht die Anzahl der betroffenen Zeilen zurückgibt. Irgendeine andere Lösung? – Sunnyday

+0

@Sunnyday, du hast Recht. Guter Fang. Es sieht so aus, als ob ich ['update'] (https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#update (java.lang.String,% 20android.content.ContentValues, % 20java.lang.String,% 20java.lang.String [])). – Suragch