Java 数据库正确访问一个变量,但不能访问另一个变量

Java 数据库正确访问一个变量,但不能访问另一个变量,java,android,database,sqlite,mobile,Java,Android,Database,Sqlite,Mobile,所以我有两个变量,我目前正在尝试访问。水和木桶。我不确定为什么waterAmt变量工作正常,但另一个变量工作不正常。bucketExp似乎没有按应有的方式存储,尽管它的存储方式与waterAmt相同。提前谢谢你的帮助 访问数据库的代码: //pull data data = new Database(SetupTimerPC1.this); data.open(); bucketExpTotal = data.getBucketExp(); totalWater = data.getWaterA

所以我有两个变量,我目前正在尝试访问。水和木桶。我不确定为什么waterAmt变量工作正常,但另一个变量工作不正常。bucketExp似乎没有按应有的方式存储,尽管它的存储方式与waterAmt相同。提前谢谢你的帮助

访问数据库的代码:

//pull data
data = new Database(SetupTimerPC1.this);
data.open();
bucketExpTotal = data.getBucketExp();
totalWater = data.getWaterAmt();
data.close();

//add new data to old
bucketExpTotal += bucketExp;
totalWater += waterAmt;

//push data
data.open();
data.bucketExpEntry(bucketExpTotal);
data.waterAmountEntry(totalWater);
data.close();
public long waterAmountEntry(int waterAmt)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_WATER, waterAmt);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end waterAmountEntry function
public long bucketExpEntry(int bucketExp)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_BUCKETEXP, bucketExp);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end bucketExpEntry function
public int getWaterAmt() 
{
    int waterAmount = 0, iWaterAmount = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {   
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iWaterAmount = c.getColumnIndex(KEY_WATER);
            waterAmount = c.getInt(iWaterAmount);
        }//end for
        c.close();
        return waterAmount;
    }//end if
    return 0;
}//end getWaterAmt function
public int getBucketExp() 
{
    int bucketExp = 0, iBucketExp = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iBucketExp = c.getColumnIndex(KEY_BUCKETEXP);
            bucketExp = c.getInt(iBucketExp);
        }//end for
        c.close();
        return bucketExp;
    }//end if
    return 0;
}//end getBucketExp function
将waterAmt输入数据库的代码:

//pull data
data = new Database(SetupTimerPC1.this);
data.open();
bucketExpTotal = data.getBucketExp();
totalWater = data.getWaterAmt();
data.close();

//add new data to old
bucketExpTotal += bucketExp;
totalWater += waterAmt;

//push data
data.open();
data.bucketExpEntry(bucketExpTotal);
data.waterAmountEntry(totalWater);
data.close();
public long waterAmountEntry(int waterAmt)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_WATER, waterAmt);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end waterAmountEntry function
public long bucketExpEntry(int bucketExp)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_BUCKETEXP, bucketExp);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end bucketExpEntry function
public int getWaterAmt() 
{
    int waterAmount = 0, iWaterAmount = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {   
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iWaterAmount = c.getColumnIndex(KEY_WATER);
            waterAmount = c.getInt(iWaterAmount);
        }//end for
        c.close();
        return waterAmount;
    }//end if
    return 0;
}//end getWaterAmt function
public int getBucketExp() 
{
    int bucketExp = 0, iBucketExp = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iBucketExp = c.getColumnIndex(KEY_BUCKETEXP);
            bucketExp = c.getInt(iBucketExp);
        }//end for
        c.close();
        return bucketExp;
    }//end if
    return 0;
}//end getBucketExp function
将bucketExp输入数据库的代码:

//pull data
data = new Database(SetupTimerPC1.this);
data.open();
bucketExpTotal = data.getBucketExp();
totalWater = data.getWaterAmt();
data.close();

//add new data to old
bucketExpTotal += bucketExp;
totalWater += waterAmt;

//push data
data.open();
data.bucketExpEntry(bucketExpTotal);
data.waterAmountEntry(totalWater);
data.close();
public long waterAmountEntry(int waterAmt)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_WATER, waterAmt);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end waterAmountEntry function
public long bucketExpEntry(int bucketExp)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_BUCKETEXP, bucketExp);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end bucketExpEntry function
public int getWaterAmt() 
{
    int waterAmount = 0, iWaterAmount = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {   
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iWaterAmount = c.getColumnIndex(KEY_WATER);
            waterAmount = c.getInt(iWaterAmount);
        }//end for
        c.close();
        return waterAmount;
    }//end if
    return 0;
}//end getWaterAmt function
public int getBucketExp() 
{
    int bucketExp = 0, iBucketExp = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iBucketExp = c.getColumnIndex(KEY_BUCKETEXP);
            bucketExp = c.getInt(iBucketExp);
        }//end for
        c.close();
        return bucketExp;
    }//end if
    return 0;
}//end getBucketExp function
从数据库中提取waterAmt的代码:

//pull data
data = new Database(SetupTimerPC1.this);
data.open();
bucketExpTotal = data.getBucketExp();
totalWater = data.getWaterAmt();
data.close();

//add new data to old
bucketExpTotal += bucketExp;
totalWater += waterAmt;

//push data
data.open();
data.bucketExpEntry(bucketExpTotal);
data.waterAmountEntry(totalWater);
data.close();
public long waterAmountEntry(int waterAmt)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_WATER, waterAmt);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end waterAmountEntry function
public long bucketExpEntry(int bucketExp)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_BUCKETEXP, bucketExp);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end bucketExpEntry function
public int getWaterAmt() 
{
    int waterAmount = 0, iWaterAmount = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {   
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iWaterAmount = c.getColumnIndex(KEY_WATER);
            waterAmount = c.getInt(iWaterAmount);
        }//end for
        c.close();
        return waterAmount;
    }//end if
    return 0;
}//end getWaterAmt function
public int getBucketExp() 
{
    int bucketExp = 0, iBucketExp = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iBucketExp = c.getColumnIndex(KEY_BUCKETEXP);
            bucketExp = c.getInt(iBucketExp);
        }//end for
        c.close();
        return bucketExp;
    }//end if
    return 0;
}//end getBucketExp function
从数据库中提取bucketExp的代码:

//pull data
data = new Database(SetupTimerPC1.this);
data.open();
bucketExpTotal = data.getBucketExp();
totalWater = data.getWaterAmt();
data.close();

//add new data to old
bucketExpTotal += bucketExp;
totalWater += waterAmt;

//push data
data.open();
data.bucketExpEntry(bucketExpTotal);
data.waterAmountEntry(totalWater);
data.close();
public long waterAmountEntry(int waterAmt)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_WATER, waterAmt);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end waterAmountEntry function
public long bucketExpEntry(int bucketExp)
{
    ContentValues cv = new ContentValues();
    cv.put(KEY_BUCKETEXP, bucketExp);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}//end bucketExpEntry function
public int getWaterAmt() 
{
    int waterAmount = 0, iWaterAmount = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {   
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iWaterAmount = c.getColumnIndex(KEY_WATER);
            waterAmount = c.getInt(iWaterAmount);
        }//end for
        c.close();
        return waterAmount;
    }//end if
    return 0;
}//end getWaterAmt function
public int getBucketExp() 
{
    int bucketExp = 0, iBucketExp = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK, KEY_WATER,
            KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE, KEY_SHOVELEXP,
            KEY_BUCKETEXP, KEY_PICKAXEEXP};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0)
    {
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
        {
            iBucketExp = c.getColumnIndex(KEY_BUCKETEXP);
            bucketExp = c.getInt(iBucketExp);
        }//end for
        c.close();
        return bucketExp;
    }//end if
    return 0;
}//end getBucketExp function

现在,您的查询相当于:

"SELECT [columns] FROM [table];"
这将返回表中的所有行。接下来,您将迭代整个结果集,并且在每次迭代中,您将值设置为返回等于结果行中的某个列

for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
    bucketExp = cursor.getInt(...);
}
本质上,这意味着
bucketExp
将等于结果最后一行中该列的值

我认为您想要的是特定行/记录的值。您需要更改查询以仅返回您正在查找的行,并摆脱
for
循环。下面是一个通过ID查找特定行并返回bucketExp的示例:

public int getBucketExp(long id) {
    String[] columns = new String[] { KEY_BUCKETEXP };
    String where = KEY_ROWID + " = ?";
    String[] whereArgs = new String[] { Long.toString(id) };

    Cursor cursor = ourDatabase.query(DATABASE_TABLE, columns, where, whereArgs,
            null, null, null);

    int bucketExp = 0;
    if (cursor.moveToFirst()) {
        bucketExp = cursor.getInt(cursor.getColumnIndex(KEY_BUCKETEXP));
    }

    return bucketExp;
}

在这两种
get
方法中,您都在整个游标上循环,并返回最后一个结果的值。这是你的本意吗?哦,不,那不是我的本意。我只希望每个变量能够访问它自己存储的值,并保存它自己的值。有什么不同的想法吗?对不起,我是android和SQLite新手,非常感谢您的帮助。该表应该有多少行?只有一行,所以我不需要担心过滤掉这些行。我试图偏离你的例子,但没有任何回报。你说我应该在名为where的字符串中的“KEY_ROWID”之后包含什么?另外,当我将代码更改为类似getWaterAmt函数中的示例时,我也不再在那里获得正确的金额。“只有一行”--你在问题中发布的代码使用
SQLiteDatabase.insert
,因此,您正在执行插入而不是更新。每次调用
wateramounty
bucketExpEntry
都将创建一个新行。使用
SQLiteDatabase.update
,如果这不是您想要的。
where
字符串应该有问号。问号将依次替换为
中的参数,其中rgs
。在本例中,我将其设置为使用已知的行ID并将其用于WHERE子句,因为我假设(基于您的帖子)您有多行。太棒了。谢谢。这解决了我的问题。我不知道。