我的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;
}
答案 0 :(得分:0)
来自AS documentation:
要查看光标中的一行,请使用Cursor移动方法之一,在开始读取值之前必须始终调用该方法
因此,您应该这样做:
while(res.moveToNext()) {
int point = res.getInt(1);
//Do your logic
}
res.close();
答案 1 :(得分:0)
您有两个问题。
您需要将Cursor移至一行(返回Cursor时将其定位在第一行之前),在您的情况下,就像只期望一行Cursor moveToFirst 方法会很合适,请注意,如果执行此操作,它将返回true,否则返回false。
您正在根据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;
}
如果您使用Cursor getColumnIndex(the_column_name)
方法根据列名返回偏移量,则比尝试计算偏移量更容易,而且不太可能引起问题。
就这样,而不是:-
i = res.getInt(0);
使用:-
i = res.getInt(res.getColumnIndex("number"));
将被推荐