【问题标题】:SQLitedatabase Update Function Not Finding Row ID?SQLitedatabase更新函数找不到行ID?
【发布时间】:2019-11-19 01:04:20
【问题描述】:

当用户点击使用他们的游戏币时,我正在尝试更新用户的“CashStack”。到目前为止,我发现用户的 ID 应该是 6,但是当我尝试在我的数据库更新函数中使用这个硬编码值时,我收到了 null 对象引用错误。谁能帮我理解为什么这个值不正确?我在 Android Studio 中工作并使用 SQLite。

正在使用的函数:public void updateCashStack(int newCashStack){..}(见下文)、fiveDollar.setOnClickListener(..)

我如何找到 ID 号:

int lastID = 0;
for (int i = 0; i < 10; i++) {
    if(userIDs[i] != 0) {
        lastID = userIDs[i];
        Toast.makeText(ChoosePokerStyle.this, "User ID = " + lastID, Toast.LENGTH_LONG).show( );
    }
}

当我运行应用程序时显示什么:

数据库代码:

public static final String DATABASE_NAME = "rockfinn.db";
private SQLiteDatabase db;
public static final String TABLE_NAME = "user_data";
public static final String COL1 = "ID";
public static final String COL2 = "NICKNAME";
public static final String COL3 = "CASHSTACK";

public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, 1);}

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "NICKNAME TEXT, " +
            "CASHSTACK INT)";
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
}

public boolean addData(String nickname) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, nickname);
    contentValues.put(COL3, 1000);

    long result = db.insert(TABLE_NAME, null, contentValues);

    if(result == -1) {
        return false;
    }
    else {
        return true;
    }
}

public void updateCashStack(int newCashStack)
{
    try
    {
        ContentValues values = new ContentValues();
        values.put(COL3, newCashStack);
        String whereClause = "id = ?";
        db.update(TABLE_NAME, values, whereClause, new String[] {"6"});
        //db.setTransactionSuccessful();
    }
    catch (Exception e)
    {
        Log.e("Error in transaction", "Error", e);
    }
    finally
    {
      // db.endTransaction();
    }
}

public Cursor getListContents() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    return data;
}

}

fiveDollar.setOnClickListener代码:

fiveDollar.setOnClickListener(new View.OnClickListener( ) {
    @Override
    public void onClick(View v)
    {
       int five = 5;
       int cashStackAsInt = Integer.parseInt(cashStack);
       cashStackAsInt = cashStackAsInt - five;
       userCashStackPrompt.setText(Integer.toString(cashStackAsInt));
       myDB.updateCashStack(cashStackAsInt);
       Toast.makeText(ChoosePokerStyle.this, "You have bet $5", Toast.LENGTH_LONG).show( );
    }
}

【问题讨论】:

  • 在数据库代码中的db.update(TABLE_NAME, values, whereClause, new String[] {"6"});行添加断点。在调试模式下运行(例如单击绿色错误))。当调试窗口出现时检查变量。猜测 db 为空。如果是这样,您需要确保 myDB 已被实例化并且 acl 在 myDB 的范围内。有关调试/断点的更多详细信息,请参阅Debug your app
  • 耶!!这有效!非常感谢,我会在以后的编程中更多地使用调试模式!
  • 那很好。我已将以上内容添加为答案。能否请您勾选这个作为答案。

标签: java android database sqlite


【解决方案1】:

在您的表格中没有标题为id 的列。应该是ID。尝试如下:

whereClause = "ID = ?";

【讨论】:

  • @BickeringVmax,你检查了吗?
【解决方案2】:

SQL 中的语法不区分大小写,但在您的数据库中定义列 String COL1 = "ID"; 它与 String whereClause = "id = ?"; 不匹配

您可以使用String whereClause = COL1 + " = ?";String whereClause = "ID = ?";

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    我收到空对象引用错误。

    最可能的原因是范围内的 myDB 实例化实例不存在。

    您可以通过在该行放置一个断点来检查这一点

    db.update(TABLE_NAME, values, whereClause, new String[] {"6"}); 
    

    DatabaseHelper.java 中。

    然后在调试模式下运行(例如单击绿色错误))。 当调试窗口出现时检查变量。

    猜测 db 为空。如果是这样,您需要确保 myDB 已被实例化并且调用在 myDB 的范围内(例如在类级别声明 myDB并在活动的 onCreate 方法或片段的等效方法中实例化它。

    您可能希望参考Debug your app 了解有关调试的更多信息。

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多