2013-01-08 174 views
1

我有一個數據庫,我在其中存儲已發送消息的數量。但是,當我發送消息時,計數器不會遞增。更新聲明不更新字段

這是數據庫類(usersdata):

import static android.provider.BaseColumns._ID; 
import static com.app.Constants.TABLE_NAME; 
import static com.app.Constants.PHONE_NUMBER; 
import static com.app.Constants.SMS_SENT; 
import static com.app.Constants.SMS_RECEIVED; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class UsersData extends SQLiteOpenHelper { 

private static final String DATABASE_NAME = "rpgsms.db"; 
private static final int DATABASE_VERSION = 1; 

public UsersData (Context ctx) { 
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
      PHONE_NUMBER + " TEXT PRIMARY KEY, " + 
      SMS_SENT + " INT, " + 
      SMS_RECEIVED + " INT);"); 
} 

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

} 

在另一類我要更新SMS_SENT領域,我做這樣的:

usersData = new UsersData(this); 
SQLiteDatabase db = usersData.getWritableDatabase(); 
db.rawQuery("UPDATE "+ TABLE_NAME + " SET "+ SMS_SENT + " = " + SMS_SENT + "+1", null); 

然而,這不更新相應的字段。我究竟做錯了什麼?

回答

2

我解決它以下列方式:

ContentValues args = new ContentValues(); 
args.put(SMS_SENT, sent+1); 
db.update(TABLE_NAME, args, ID, new String[] {"id_value"}); 
1

試試這個,

在創建表使用INTEGER代替INT。它應該工作。

db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
     PHONE_NUMBER + " TEXT PRIMARY KEY, " + 
     SMS_SENT + " INTEGER, " + 
     SMS_RECEIVED + " INTEGER);"); 
+0

SQLite會自動更改爲INTEGER。閱讀[this](http://www.sqlite.org/datatype3.html)它不會解決問題。 –

+0

無論如何謝謝你的回答。 – user1301428

+0

您可以使用虛擬值更新該字段嗎?嘗試,如果它得到更新,那麼問題在於編碼。如果不是那麼它的數據庫問題 – GoCrazy

0

chnge您的UPDATE查詢爲:

int newcount=SMS_SENT+1; 
db.rawQuery("UPDATE "+ TABLE_NAME + " SET "+ 
         SMS_SENT + " = " + newcount + "", null); 
         ^^^^^ 

,並確保SMS_SENT爲String列名不是一個數量

+1

SMS_SENT是字段的名稱,而不是整數值 –

+0

@CsehTamás:那麼什麼是'SMS_SENT +'的輸出+1「'?意味着你正在用1遞增列名? –

+0

將字段名稱與「+1」連接在一起 –

2

看來別人有同樣的問題。它使用功能execSQL而不是rawQuery來解決以更新該字段。

你可以閱讀一下:Increase the value of a record in android/sqlite database

+0

謝謝你的回答。不幸的是,這並沒有解決我的問題,但我開始認爲這可能是某種數據庫問題,因爲即使我嘗試使用SQLite編輯器編輯值,有時更新也不會保存。 – user1301428

2

繼良好的數據庫設計,幾乎總是一個好主意,有一個字段ID一個整數數據類型,並具有價值的汽車增量,努力打造獨特的記錄。爲了您的具體問題可以通過只增加一個ID柱很容易解決,將其設置爲INTEGER數據類型,而不是INT,你會擁有高性能的數據庫,如(PostgreSQL系統,MySQL等做.. )。試着改變你的架構是這樣的,它應該做的伎倆:

db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
     ID + " INTEGER PRIMARY KEY, " + 
     PHONE_NUMBER + " TEXT, " + 
     SMS_SENT + " INTEGER, " + 
     SMS_RECEIVED + " INTEGER);" 
    ); 

所有您需要做的只是在數值傳爲PHONE_NUMBERSMS_SENTSMS_RECEIVED和您的計數器(在ID場)應當啓動相應增加。欲瞭解更多信息,你可以看看這post

2

更新SQL語句缺少where子句所以將更新所有行。試試這個:

db.rawQuery("UPDATE "+ TABLE_NAME + " SET "+ SMS_SENT 
    + " = " + SMS_SENT + "+1 WHERE " + PHONE_NUMBER 
    + " = '" + phoneNumber +"'", null);