我试图以以下方式从MainActivity访问数据库中的一行。我想知道一种更好的方法,因为这每次都会使我的应用程序崩溃并出现错误。即使在冷重启和擦除数据之后。
“ 23:06模拟器:glTexImage2D:得到了err pre :( 0x502内部0x1908格式0x1908类型0x1401
我认为有更好的方法可以做到这一点。我正在调用一个方法,该方法采用一个User对象,该对象可能存储在数据库中的索引1处(数据库的第一位)
if(myDb.isNotEmpty() == true) {
MyProgress.calculateBalance***(myDb.getUser(1));***
这是我的getUser方法。
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String[] { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null)
cursor.moveToFirst();
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
答案 0 :(得分:1)
更好的方法是使用Save data in a local database using Room
这是您的代码,我看到执行了空检查,但它仅保护NPE的一条语句。您需要在这种if条件下包装用户创建。
@Nullable
public User getUser(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String[] { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null && cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
}
return null;
}
答案 1 :(得分:0)
方法的最后一部分应如下所示:
if ((cursor != null) && (cursor.moveToFirst()) {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(0)));
user.setWeight (Integer.parseInt(cursor.getString(1)));
user.setAge(Integer.parseInt(cursor.getString(2)));
return user;
} else {
return null;
}
此代码可确保如果返回的游标为null
或不包含至少1行,则不会引发错误。
在这种情况下,该方法将返回null
。
当然,如果游标已准备就绪且没有错误,并且myDB
已正确初始化,则没有理由使游标为null,因此必须检查有效的列,表和数据库名称。
同样,在进行任何更改后,您始终会从模拟器/设备上卸载该应用程序,以便删除数据库并重新运行该应用程序以重新创建所有内容。