一个在SQLite数据库Android的增量领域 [英] Increment the field by one in sqlite database android

查看:167
本文介绍了一个在SQLite数据库Android的增量领域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有它重新presents店为我的比赛一个表的数据库。问题是,当我使用的方法来购买它并没有一个递增的价值,但只是将其设置为零。那么,如何可以通过提高各一个,它被称为特定ID时间递增ItemNumberOfPurchases的值的方法?这是我的code这一点。

 公共类MonsterTapDatabase扩展SQLiteOpenHelper {
静态最后弦乐DBNAME =MonsterTapDb;
静态最终诠释版本= 1;
静态最后弦乐tTableName =商店;
静态最后弦乐fItemID =项目ID;
静态最后弦乐fItemName =了itemname;
静态最后弦乐fItemNumberOfPurchases =NumberOfPurchases;
静态最后弦乐fItemIsLocked =IsItemLocked;


公共MonsterTapDatabase(上下文的背景下){
    超(背景下,数据库名,空,版本);
}

@覆盖
公共无效的onCreate(SQLiteDatabase sqLiteDatabase){
    sqLiteDatabase.execSQL(CREATE TABLE IF NOT EXISTS+ tTableName +(+
            fItemID +INTEGER PRIMARY KEY,+
            fItemName +TEXT+
            fItemNumberOfPurchases +INT+
            fItemIsLocked +TEXT+
            ));
    ContentValues​​ CV =新ContentValues​​();
    cv.put(fItemID,1);
    cv.put(fItemName,住);
    cv.put(fItemNumberOfPurchases,0);
    cv.put(fItemIsLocked,真);
    sqLiteDatabase.insert(tTableName,空,CV);
    cv.put(fItemID,2);
    cv.put(fItemNameHardmode);
    cv.put(fItemNumberOfPurchases,0);
    cv.put(fItemIsLocked,真);
    sqLiteDatabase.insert(tTableName,空,CV);
    cv.put(fItemID,3);
    cv.put(fItemName,反向);
    cv.put(fItemNumberOfPurchases,0);
    cv.put(fItemIsLocked,真);
    sqLiteDatabase.insert(tTableName,空,CV);
    cv.put(fItemID,4);
    cv.put(fItemName,反转Hardmode);
    cv.put(fItemNumberOfPurchases,0);
    cv.put(fItemIsLocked,真);
    sqLiteDatabase.insert(tTableName,空,CV);
}

@覆盖
公共无效onUpgrade(SQLiteDatabase sqLiteDatabase,诠释我,诠释I1){
    sqLiteDatabase.execSQL(DROP TABLE IF EXISTS+ tTableName);
    的onCreate(sqLiteDatabase);
}
公共无效报价(INT ID){

    SQLiteDatabase MYDB = this.getWritableDatabase();
    myDB.execSQL(UPDATE+ tTableName +
            SET+ fItemNumberOfPurchases += IFNULL(+ fItemNumberOfPurchases +,0)1+
            WHE​​RE+ fItemID +=+ ID);
    myDB.close();

}
公共无效lockItem(INT ID){
    SQLiteDatabase MYDB = this.getWritableDatabase();
    ContentValues​​ CV =新ContentValues​​();
    cv.put(fItemIsLocked,假);
    myDB.update(tTableName,CV,fItemID +=?,新的String [] {将String.valueOf(ID)});
}
公共字符串isPurchased(INT ID){
    SQLiteDatabase MYDB = this.getReadableDatabase();
    的String [] MYSEARCH =新的String [] {将String.valueOf(ID)};
    光标myCursor = myDB.rawQuery(选择+ fItemIsLocked +FROM+ tTableName +WHERE+ fItemID +=?,MYSEARCH);
    myCursor.moveToFirst();
    INT指数= myCursor.getColumnIndex(fItemID);
    字符串myAnswer = myCursor.getString(指数);
    myCursor.close();
    返回myAnswer;
}
公众诠释numberOfLives(){
    INT ID = 1;
    SQLiteDatabase MYDB = this.getReadableDatabase();
    的String [] MYSEARCH =新的String [] {将String.valueOf(ID)};
    光标myCursor = myDB.rawQuery(选择+ fItemNumberOfPurchases +FROM+ tTableName +WHERE+ fItemID +=?,MYSEARCH);
    myCursor.moveToFirst();
    INT指数= myCursor.getColumnIndex(fItemNumberOfPurchases);
    myCursor.close();
    返回指数;
}
 

}

解决方案
  1. 您正在使用 fItemNumberOfPurchases 而不是 fItemID ;
  2. 为什么你对子级比较有不平等ID?
  3. 如果 fItemNumberOfPurchases NULL ,运算与数字总是返回 NULL ,这可能与 IFNULL 处理。

修正:

  SQLiteDatabase MYDB = this.getWritableDatabase();
myDB.execSQL(UPDATE+ tTableName +
    SET+ fItemNumberOfPurchases += IFNULL(+ fItemNumberOfPurchases +,0)1+
    WHE​​RE+ fItemID +=+ ID);
myDB.close();
 

I have a database with a table which represents Shop for my game. The problem is, that when I use the method to purchase it doesn't increment the value by one but just sets it to zero. So how can I improve the method to increment the value of ItemNumberOfPurchases by one each time it's called for specific ID ? Here is my code for this.

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

}

解决方案

  1. You are using fItemNumberOfPurchases instead of fItemID;
  2. Why whould you compare a ID with a inequality?
  3. If fItemNumberOfPurchases is NULL, arithmetic with numbers will always return NULL, which may be handled with IFNULL.

Corrected:

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

这篇关于一个在SQLite数据库Android的增量领域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆