Java 在sqlite数据库中,将字段增加1

Java 在sqlite数据库中,将字段增加1,java,android,sqlite,Java,Android,Sqlite,我有一个数据库和一个代表我的游戏商店的表。问题是,当我使用该方法购买时,它不会将值增加1,而是将其设置为零。那么,我如何改进方法,使ItemNumberOfPurchases的值在每次为特定ID调用时增加1?这是我的代码 public class MonsterTapDatabase extends SQLiteOpenHelper { static final String dbName = "MonsterTapDb"; static final int version = 1; stati

我有一个数据库和一个代表我的游戏商店的表。问题是,当我使用该方法购买时,它不会将值增加1,而是将其设置为零。那么,我如何改进方法,使ItemNumberOfPurchases的值在每次为特定ID调用时增加1?这是我的代码

public class MonsterTapDatabase extends SQLiteOpenHelper {
static final String dbName = "MonsterTapDb";
static final int version = 1;
static final String tTableName = "Shop";
static final String fItemID = "ItemID";
static final String fItemName = "ItemName";
static final String fItemNumberOfPurchases = "NumberOfPurchases";
static final String fItemIsLocked = "IsItemLocked";


public MonsterTapDatabase(Context context) {
    super(context, dbName, null, version);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+tTableName+" (" +
            fItemID + " INTEGER PRIMARY KEY , " +
            fItemName + " TEXT , " +
            fItemNumberOfPurchases + " INT, " +
            fItemIsLocked + " TEXT" +
            ")");
    ContentValues cv = new ContentValues();
    cv.put(fItemID, 1);
    cv.put(fItemName, "Lives");
    cv.put(fItemNumberOfPurchases, 0);
    cv.put(fItemIsLocked, "true");
    sqLiteDatabase.insert(tTableName, null, cv);
    cv.put(fItemID, 2);
    cv.put(fItemName, "Hardmode");
    cv.put(fItemNumberOfPurchases, 0);
    cv.put(fItemIsLocked, "true");
    sqLiteDatabase.insert(tTableName, null, cv);
    cv.put(fItemID, 3);
    cv.put(fItemName, "Reversed");
    cv.put(fItemNumberOfPurchases, 0);
    cv.put(fItemIsLocked, "true");
    sqLiteDatabase.insert(tTableName, null, cv);
    cv.put(fItemID, 4);
    cv.put(fItemName, "Reversed Hardmode");
    cv.put(fItemNumberOfPurchases, 0);
    cv.put(fItemIsLocked, "true");
    sqLiteDatabase.insert(tTableName, null, cv);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + tTableName);
    onCreate(sqLiteDatabase);
}
public void purchase(int ID){

    SQLiteDatabase myDB = this.getWritableDatabase();
    myDB.execSQL("UPDATE " + tTableName+
            " SET "+fItemNumberOfPurchases+"=IFNULL("+fItemNumberOfPurchases+",0)+1"+
            " WHERE "+fItemID+"="+ID);
    myDB.close();

}
public void lockItem(int ID){
    SQLiteDatabase myDB = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(fItemIsLocked, false);
    myDB.update(tTableName, cv, fItemID+"=?", new String []{String.valueOf(ID)});
}
public String isPurchased(int ID){
    SQLiteDatabase myDB = this.getReadableDatabase();
    String[] mySearch = new String[]{String.valueOf(ID)};
    Cursor myCursor = myDB.rawQuery("SELECT "+ fItemIsLocked +" FROM "+ tTableName +" WHERE "+ fItemID +"=?",mySearch);
    myCursor.moveToFirst();
    int index = myCursor.getColumnIndex(fItemID);
    String myAnswer = myCursor.getString(index);
    myCursor.close();
    return myAnswer;
}
public int numberOfLives(){
    int ID = 1;
    SQLiteDatabase myDB = this.getReadableDatabase();
    String[] mySearch = new String[]{String.valueOf(ID)};
    Cursor myCursor = myDB.rawQuery("SELECT "+ fItemNumberOfPurchases +" FROM "+ tTableName +" WHERE "+ fItemID +"=?",mySearch);
    myCursor.moveToFirst();
    int index = myCursor.getColumnIndex(fItemNumberOfPurchases);
    myCursor.close();
    return index;
}
}

  • 您使用的是
    fItemNumberOfPurchases
    而不是
    fItemID
  • 为什么你要把一个ID和一个不平等性进行比较
  • 如果
    fItemNumberOfPurchases
    NULL
    ,则带有数字的算术运算将始终返回
    NULL
    ,这可以通过处理
  • 更正:

    SQLiteDatabase myDB = this.getWritableDatabase();
    myDB.execSQL("UPDATE " + tTableName+
        " SET "+fItemNumberOfPurchases+"=IFNULL("+fItemNumberOfPurchases+",0)+1"+
        " WHERE "+fItemID+"="+ID);
    myDB.close();
    

    是否为表设置了主键?是的,ID是主键。但是我不想增加ID,但是FitemNumberOfPurchases您可以将主键设置为AUTOINCREMENTAutoincrementing不起作用。我希望它先将数字设置为1,然后设置为2,依此类推。但是您和我的代码都不起作用可能您还没有初始化
    fItemNumberOfPurchases
    ,因此它是
    NULL
    NULL+1=NULL
    。使用
    CAST(…作为整数)
    将解决此问题。更新后仍然不起作用。我基本上使用了另一个问题中的myDB.execSQL(),但它似乎不起作用,仍然不起作用。嗯,你能给我建议另一种解决办法吗?我有一张如上所述的桌子。我有一个叫fItemID的主键。每次执行此方法时,我想将fItemNumberOFPurchases的值增加1。我得到了无法打开数据库的异常。我将用datagase类的完整源代码编辑我的问题