【问题标题】:SQLite giving null pointer [duplicate]SQLite给出空指针[重复]
【发布时间】:2019-05-20 21:14:07
【问题描述】:

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

【问题讨论】:

  • rawQuery() 不返回空值 - 你的问题是别的。请首先在问题中包含崩溃堆栈跟踪。

标签: android sqlite nullpointerexception


【解决方案1】:

来自 AS documentation:

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

所以,你应该这样做:

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

【讨论】:

    【解决方案2】:

    你有两个问题。

    1. 您需要将光标移动到一行(当返回光标时,它位于第一行之前)在您的情况下,只期望一行光标 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"));
    

    推荐

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2018-10-06
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多