我有这个方法:
public String givenCheckmark(String name, String date)
{
SQLiteDatabase db = Cache.openDatabase();
Cursor cursor = db.rawQuery("select value from checkmarks where timestamp ='"+date+"' and habit ='"+name+"'", null);
String habitValue = "";
cursor.moveToFirst();
if (!(cursor == null)) {
habitValue = Integer.toString(cursor.getInt(0));
}
cursor.close();
return habitValue;
}
出于某种原因,如果我删除
habitValue = Integer.toString(cursor.getInt(0));
该应用不会崩溃。所以问题必须在cursor.getInt(0)中。查询只返回一行。我猜测光标不在第一行但是......为什么??
答案 0 :(得分:2)
最可能的原因是索引“0”处的项目不是整数。另一个原因是Cursor本身可能是空的。最后,您可能必须检查是否确实返回了值。
要解决第一部分,您需要使用Cursor#getColumnIndex()
来获取您要检索的列的索引。所以,如果它是你想要的“id”,那么你会这样做:
int id = cursor.getInt(cursor.getColumnIndex("id"));
要解决第二部分,您需要确保返回结果。为此,您只需检查Cursor#getCount()
即可。所以:
boolean isEmpty = cursor.getCount() == 0;
或者,如果光标为空,Cursor#moveToFirst()
的返回值实际上将返回false
,这意味着您可以使用以下内容检索值:
if (cursor != null && cursor.moveToFirst()) {
// The cursor is not null and contains elements. Continue retrieving values.
}
对于第三部分,您可以使用Cursor#isNull()
检查给定索引是否存在值。所以像这样:
boolean doesNotHaveValue = cursor.isNull(cursor.getColumnIndex("id"));
我在这里看到的其他问题是你在将光标移动到第一个索引后检查光标是否为空意味着无论是否有NullPointerException
你都会得到let totalTime = self.avPlayer.currentItem!.duration
print("time: \(CMTimeGetSeconds(totalTime))")
self.avPlayer.pause()
let touchDelta = swipeGesture.translationInView(self.view).x / CGFloat(CMTimeGetSeconds(totalTime))
let currentTime = CMTimeGetSeconds((avPlayer.currentItem?.currentTime())!) + Float64(touchDelta)
print(currentTime)
if currentTime >= 0 && currentTime <= CMTimeGetSeconds(totalTime) {
let newTime = CMTimeMakeWithSeconds(currentTime, Int32(NSEC_PER_SEC))
print(newTime)
self.avPlayer.seekToTime(newTime)
}
游标为null。无论是否为空,您还要关闭游标。