从MainActivity访问数据库中的行怎么了?

时间:2018-11-15 21:34:28

标签: android sqlite

我试图以以下方式从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;
    }

2 个答案:

答案 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,因此必须检查有效的列,表和数据库名称。
同样,在进行任何更改后,您始终会从模拟器/设备上卸载该应用程序,以便删除数据库并重新运行该应用程序以重新创建所有内容。