如何在android中检查游标是否为null?

时间:2015-04-14 09:15:54

标签: android sqlite

我正在尝试检查ID表中字段BangCauHoi的值。 这是我的功能:

public boolean checkID(String ndCauHoi){
        boolean check = true;
        String query = "select ID from BangCauHoi where CauHoi=?";
        Cursor c = database.rawQuery(query, new String[] { ndCauHoi });
        if (c != null)
        {
             c.moveToFirst();
                 if (c.isNull(c.getColumnIndex("ID")))
                 {
                     check = false;
                 }
        }
         c.close();
    return check;
}

结果:

java.lang.RuntimeException: Unable to start activity ComponentInfo{us.datn_02/us.datn_02.ShowQuestion}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

有人可以帮我吗?

如果我将代码更改为:

public boolean checkID(String ndCauHoi){
        boolean check = true;
        String query = "select ID from BangCauHoi where CauHoi=?";
        Cursor c = database.rawQuery(query, new String[] { ndCauHoi });
        if (c.moveToFirst())
        {
                 if (c.isNull(c.getColumnIndex("ID")))
                 {
                     check = false;
                 }
        }
         c.close();
    return check;
}

然后它始终返回true,即使字段ID与此where子句没有任何值。

请帮帮我!... 抱歉,因为我的英文。

2 个答案:

答案 0 :(得分:2)

您的数据库没有选择任何行,moveToFirst()返回false。如果未选中,您将获得有关尝试从不存在的行检索值的例外情况。选中后,它会返回您指定的默认值true

答案 1 :(得分:1)

您可以使用以下语句检查它是否为空:

if (c.moveTofirst() && c.getCount > 0)

if (c != null && c.moveToFirst())

至于为什么它是空的,我猜你在某处错误地输入了一个声明。我总是使用query类中的SQLiteDatabase method而不是rawQuery,并使用常量作为我的列名而不是硬编码来尝试避免这些问题。

public static final String KEY_ID = "_id";
public static final String TABLE_NAME="BangCauHoi";
public static final String CAUHOI = "CauHoi";

Cursor c = yourDatabaseInstance.getReadabledatabase().query(
    YourDatabaseName.TABLE_NAME, 
    new String[] { YourDatabaseName.KEY_ID },
    YourDatabaseName.CAUHOI + "=?", 
    new String[] { ndCauHoi }, 
    null, null, null);