【发布时间】: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