Java 在sqlite数据库中,将字段增加1
我有一个数据库和一个代表我的游戏商店的表。问题是,当我使用该方法购买时,它不会将值增加1,而是将其设置为零。那么,我如何改进方法,使ItemNumberOfPurchases的值在每次为特定ID调用时增加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
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
李>
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类的完整源代码编辑我的问题