SQLite 给出 null 指针 [duplicate]

SQLite giving null pointer [duplicate]

提问人:Yonatan Rotem 提问时间:12/20/2018 最后编辑:PhantômaxxYonatan Rotem 更新时间:12/20/2018 访问量:38

问:

我的SQLite给了我一个空指针。我正在尝试将点写入数据库,并能够从中读取它们。这就是完整的表格。 表中没有其他内容。 当我运行查询时,我在 getPoints 函数中获取空指针。res 出来是 null。

这是代码

public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(
            "create table hour " +
                    "(id integer primary key, number integer)");
    db.execSQL(
            "create table points " +
                    "(id integer primary key, number integer)"
    );
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS hour");
    onCreate(db);
}
public boolean insertPoints (int points) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("number", points);
    db.insert("points", null, contentValues);
    return true;
}

public int getPoints() {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select number from points where id=1", null );
    int i = res.getInt(1);
    return i;
}
Android SQLite NullPointerException

评论

0赞 laalto 12/20/2018
rawQuery()不返回 null - 您的问题是另一回事。请首先在问题中包含崩溃堆栈跟踪。

答:

0赞 tomerpacific 12/20/2018 #1

来自 AS 文档

若要查看游标中的行,请使用 Cursor move 方法之一,在开始读取值之前,必须始终调用该方法

因此,您应该这样做:

while(res.moveToNext()) {
    int point = res.getInt(1);
    //Do your logic
}
res.close();
0赞 MikeT 12/20/2018 #2

您有两个问题。

  1. 您需要将 Cursor 移动到一行(当 Cursor 返回时,它位于第一行之前) 在您的情况下,由于只期望一行,Cursor moveToFirst 方法将适合,请注意,如果移动,它将返回 true,如果不是,则返回 false。

  2. 您正在根据 提取单个列。您可以使用偏移量访问 Cursor 中的列,因此如果只有 1 列,则偏移量将是 0 而不是 1(因此在修复第一个问题后会失败)。SELECT member FROM ....int i = res.getInt(1)

因此,建议您更改:-

public int getPoints() {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select number from points where id=1", null );
    int i = res.getInt(1);
    return i;
}

成为

public int getPoints() {
    int i = -1; // default return value to indicate no row found and thus no data
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select number from points where id=1", null );
    if (res.moveToFrist()) {
        i = res.getInt(0);
    }
    res.close(); //<<<<<<<<<< YOU SHOULD ALWAYS CLOSE CURSORS WHEN DONE WITH THEM
    return i;
}
  • 请注意,如果没有与 id 1 匹配的行,上述代码将返回 -1。 如果 -1 不是一个合适的值(我的猜测是,因为它不能少于 0 分),然后用 -1 代替另一个值。

附加

如果使用 Cursor 方法根据列名返回偏移量,则更容易且不太可能引起问题,而不是尝试计算偏移量。getColumnIndex(the_column_name)

因此,而不是:-

i = res.getInt(0);

用:-

i = res.getInt(res.getColumnIndex("number"));

会被推荐