我有一个数据库,我在其中存储已发送消息的数量。但是,当我发送消息时,计数器不会递增。
这是数据库类(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);
但是,这不会更新相应的字段。我做错了什么?
答案 0 :(得分:2)
看来别人有同样的问题。它使用函数execSQL
而不是rawQuery
来解决,以更新字段。
您可以在此处阅读:Increase the value of a record in android/sqlite database
答案 1 :(得分:2)
遵循良好的数据库设计,使用整数数据类型的字段 ID
几乎总是一个好主意,并且该值会自动增加以创建唯一记录。对于您的特定问题,只需添加 ID
列并将其设置为 INTEGER
数据类型而不是即可轻松解决像{Postgresql,MySQL等...)这样的高性能数据库一样INT
。尝试将模式更改为类似的东西,它应该可以解决问题:
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" +
ID + " INTEGER PRIMARY KEY, " +
PHONE_NUMBER + " TEXT, " +
SMS_SENT + " INTEGER, " +
SMS_RECEIVED + " INTEGER);"
);
您现在要做的只是传递PHONE_NUMBER
,SMS_SENT
,SMS_RECEIVED
的值,并且您的计数器(ID
字段)应该相应地增加。有关详细信息,请查看此post。
答案 2 :(得分:2)
我通过以下方式解决了这个问题:
ContentValues args = new ContentValues();
args.put(SMS_SENT, sent+1);
db.update(TABLE_NAME, args, ID, new String[] {"id_value"});
答案 3 :(得分:2)
update sql语句缺少where子句,因此会更新所有行。试试这个:
db.rawQuery("UPDATE "+ TABLE_NAME + " SET "+ SMS_SENT
+ " = " + SMS_SENT + "+1 WHERE " + PHONE_NUMBER
+ " = '" + phoneNumber +"'", null);
答案 4 :(得分:1)
试试这个,
创建表时使用INTEGER
代替INT
。它应该工作。
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" +
PHONE_NUMBER + " TEXT PRIMARY KEY, " +
SMS_SENT + " INTEGER, " +
SMS_RECEIVED + " INTEGER);");
答案 5 :(得分:0)
将您的UPDATE查询更改为:
int newcount=SMS_SENT+1;
db.rawQuery("UPDATE "+ TABLE_NAME + " SET "+
SMS_SENT + " = " + newcount + "", null);
^^^^^
并确保SMS_SENT
是字符串列名而不是数字