SQLite给出空指针

时间:2018-12-20 10:48:08

标签: android sqlite nullpointerexception

我的SQLite给我一个空指针。我试图将这些点写入数据库,并能够从中读取它们。那是完整的表。 桌子上没有其他东西了。 运行查询时,我在getPoints函数中获取了空指针。 res结果为空。

这是代码

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;
}

2 个答案:

答案 0 :(得分:0)

来自AS documentation

  

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

因此,您应该这样做:

while(res.moveToNext()) {
    int point = res.getInt(1);
    //Do your logic
}
res.close();

答案 1 :(得分:0)

您有两个问题。

  1. 您需要将Cursor移至一行(返回Cursor时将其定位在第一行之前),在您的情况下,就像只期望一行Cursor moveToFirst 方法会很合适,请注意,如果执行此操作,它将返回true,否则返回false。

  2. 您正在根据SELECT member FROM ....提取单个列。您可以使用偏移量访问Cursor中的列,因此,如果只有1列,则偏移量将为0而不是1(因此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"));

将被推荐