提问人:Yonatan Rotem 提问时间:12/20/2018 最后编辑:PhantômaxxYonatan Rotem 更新时间:12/20/2018 访问量:38
SQLite 给出 null 指针 [duplicate]
SQLite giving null pointer [duplicate]
问:
我的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;
}
答:
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
您有两个问题。
您需要将 Cursor 移动到一行(当 Cursor 返回时,它位于第一行之前) 在您的情况下,由于只期望一行,Cursor moveToFirst 方法将适合,请注意,如果移动,它将返回 true,如果不是,则返回 false。
您正在根据 提取单个列。您可以使用偏移量访问 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"));
会被推荐
评论
rawQuery()
不返回 null - 您的问题是另一回事。请首先在问题中包含崩溃堆栈跟踪。