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);

ただし、これは対応するフィールドを更新しません。私は何が間違っているのですか?

4

6 に答える 6

2

私はそれを次のように解決しました:

ContentValues args = new ContentValues();
args.put(SMS_SENT, sent+1);
db.update(TABLE_NAME, args, ID, new String[] {"id_value"});
于 2013-01-13T22:58:50.713 に答える
2

他の誰かが同じ問題を抱えていたようです。フィールドを更新するexecSQL代わりに関数を使用して解決されました。rawQuery

あなたはここでそれについて読むことができます:android/sqliteデータベースのレコードの値を増やします

于 2013-01-13T18:11:49.030 に答える
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_NUMBERそれSMS_SENTに応じSMS_RECEIVEDてカウンター(IDフィールド)がインクリメントを開始するはずです。詳細については、この投稿をチェックしてください。

于 2013-01-13T21:07:11.967 に答える
2

update sqlステートメントにwhere句がないため、すべての行が更新されます。これを試して:

db.rawQuery("UPDATE "+ TABLE_NAME + " SET "+ SMS_SENT
    + " = " + SMS_SENT + "+1 WHERE " + PHONE_NUMBER
    + " = '" + phoneNumber +"'", null);
于 2013-01-17T01:38:58.550 に答える
1

これを試して、

テーブルの作成中INTEGERに、の代わりに使用しますINT。動作するはずです。

db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
        PHONE_NUMBER + " TEXT PRIMARY KEY, " +
        SMS_SENT + " INTEGER, " +
        SMS_RECEIVED + " INTEGER);");
于 2013-01-08T16:09:26.863 に答える
0

UPDATEクエリを次のように変更します。

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

SMS_SENT文字列の列名が数値ではないことを確認してください

于 2013-01-08T16:19:51.420 に答える