2015-01-07 4 views
0

내 게임을위한 쇼핑을 나타내는 테이블이있는 데이터베이스가 있습니다. 문제는 구매할 때 메서드를 사용할 때 값을 1 씩 증가시키지 않고 0으로 설정한다는 것입니다. 그렇다면 특정 ID가 호출 될 때마다 ItemNumberOfPurchases의 값을 하나씩 늘리는 방법을 어떻게 개선 할 수 있습니까? 여기에 대한 내 코드입니다.sqlite 데이터베이스에서 필드를 1 씩 증가시킵니다. android

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

}

+0

당신이 테이블에 대한 기본 키를 설정 했습니까? – chain

+0

예, ID는 기본 키입니다. 하지만 ID를 증가시키고 싶지 않지만 fItemNumberOfPurchases – Traabefi

+0

기본 키를 AUTOINCREMENT로 설정할 수있었습니다. – Bram

답변

0
  1. 당신은 fItemNumberOfPurchases 대신 fItemID를 사용하는;
  2. 왜 ID를 불평등으로 비교할 수 있습니까?
  3. fItemNumberOfPurchasesNULL 인 경우 숫자를 사용한 산술은 항상 NULL을 반환하며 IFNULL으로 처리 할 수 ​​있습니다.

은 수정 :

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

이 방법은 작동하지 않습니다. 우선 번호를 1로 설정하고 2로 설정합니다. 하지만 당신이나 지뢰 코드가 작동하지 않습니다. – Traabefi

+0

아마도'fItemNumberOfPurchases'를 초기화하지 않았으므로'NULL'이고'NULL + 1 = NULL'입니다. 'CAST (... AS INTEGER) '를 사용하면이 문제를 해결할 수 있습니다. 업데이트 후 여전히 –

+0

이 작동하지 않습니다. 기본적으로이 myDB.execSQL()을 다른 질문에서 사용했지만 작동하지 않는 것 같습니다. – Traabefi

관련 문제