Java 应用程序与cursor.getInt()一起崩溃

Java 应用程序与cursor.getInt()一起崩溃,java,android-studio,Java,Android Studio,我有这个方法: 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 habit

我有这个方法:

 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”处的项不是整数。另一个原因是光标本身可能是空的。最后,您可能需要检查是否实际返回了一个值

要处理第一部分,需要使用
Cursor 35; getColumnIndex()
获取要检索的列的索引。因此,如果你想要一个“id”,那么你应该:

intid=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()
检查给定索引处是否有值。比如说:

if (cursor != null && cursor.moveToFirst()) {
   // The cursor is not null and contains elements.  Continue retrieving values.
} 
boolean-doesNotHaveValue=cursor.isNull(cursor.getColumnIndex(“id”)


我在这里看到的其他问题是,在将光标移动到第一个索引后,您正在检查光标是否为null,这意味着无论光标是否为null,您都会得到一个
NullPointerException
。无论光标是否为空,都将关闭光标

最可能的原因是索引“0”处的项不是整数。另一个原因是光标本身可能是空的。最后,您可能需要检查是否实际返回了一个值

要处理第一部分,需要使用
Cursor 35; getColumnIndex()
获取要检索的列的索引。因此,如果你想要一个“id”,那么你应该:

intid=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()
检查给定索引处是否有值。比如说:

if (cursor != null && cursor.moveToFirst()) {
   // The cursor is not null and contains elements.  Continue retrieving values.
} 
boolean-doesNotHaveValue=cursor.isNull(cursor.getColumnIndex(“id”)


我在这里看到的其他问题是,在将光标移动到第一个索引后,您正在检查光标是否为null,这意味着无论光标是否为null,您都会得到一个
NullPointerException
。无论光标是否为空,都将关闭光标

你在编译器上发现了什么错误?对不起,我忘了说那个。编译器不显示错误。但是应用程序会突然检查你的Cursor.getInt(0)是否为NULL。我猜您的数据库没有返回值。您应该使用cursor.moveToFirst()的返回值来检查cursor中是否有任何内容。这可能不会有帮助,但无论如何你都应该这样做。你在编译器上遇到了什么错误?很抱歉,我忘了这么说。编译器不显示错误。但是应用程序会突然检查你的Cursor.getInt(0)是否为NULL。我猜您的数据库没有返回值。您应该使用cursor.moveToFirst()的返回值来检查cursor中是否有任何内容。这可能不会有帮助,但你无论如何都应该这样做。我不理解第二部分和第三部分之间的区别。而且它肯定是一个整数光标指向一个特定的行。“getCount()”告诉您有多少行。如果没有行,则没有结果。“isNull()”告诉您当前行的特定索引(列)是否为null。我看到您只从表中获取“value”列,所以这很好,因为这将是唯一返回的内容。通常,当您执行查询时,您有许多行和列,并且不能保证它们的显示顺序。好的,我明白了。此外,在第一部分中,您告诉我删除select值。。将其拆分并替换为cursor.getInt(cursor.getColumnIndex(“id”)?“id”是表的假设列名。在这种情况下,您将使用“value”,因为这是表中列的名称。在这种情况下没有必要这样做,因为您只查询“值”。不过,您确实需要检查“getCount”和“isNull”。我不理解第二部分和第三部分之间的区别。而且它肯定是一个整数光标指向一个特定的行。“getCount()”告诉您有多少行。如果没有行,则没有结果。“isNull()”告诉您当前行的特定索引(列)是否为null。我看到您只从表中获取“value”列,所以这很好,因为这将是唯一返回的内容。通常,当您执行查询时,您有许多行和列,并且不能保证它们的显示顺序。好的,我明白了。此外,在第一部分中,您告诉我删除select值。。将其拆分并替换为cursor.getInt(cursor.getColumnIndex(“id”)?“id”是表的假设列名。在这种情况下,您将使用“value”,因为这是表中列的名称。在这种情况下没有必要这样做,因为您只查询“值”。不过,您确实需要检查“getCount”和“isNull”。