2013-01-08 125 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);