如何在SQLiteDatabase查询中测试游标是否为空

时间:2011-08-28 18:09:28

标签: java android database sqlite cursor

我有一个SQL表,它由以下代码创建:

public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT
        + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, "
        + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER
        + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA
        + " TEXT NOT NULL);");
}

我按如下方式查询表:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME
    + " GROUP BY " + SUBJECT + ";";

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null);

问题是如果光标为空(即表没有存储值,则必须启动活动A),如果光标不为空(即表填充),则必须启动活动B.

我无法找到一个可以告诉我表是否为空的方法。 我试过按如下方式使用Log:

private void showSubjectsOnList() {
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME
        + " GROUP BY " + SUBJECT + ";";

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null);

    Log.d("Events",Integer.toString(cursor.getCount()));
    if(cursor.isNull(0)!=false){
        cursor.close();
        subjects.close();
        startActivity(new Intent(this,OpenScreen.class));
    }
}

但是LOG显示1,如果表是空的......再次1,如果表有1个条目....它显示2,如果表有两个条目,依此类推。

你能否提出一些方法来解决我根据游标是否为空来启动不同活动的问题。

6 个答案:

答案 0 :(得分:57)

如何像这样测试光标,然后做你所说的:

if(cursor!=null && cursor.getCount()>0)
  

getCount()

返回游标中的行数

http://developer.android.com/reference/android/database/Cursor.html#getCount()

答案 1 :(得分:23)

测试空游标的最简单,最干净的方法是以下代码:

if ( cursor.moveToFirst() ) {
    // start activity a
} else {
    // start activity b
}

根据文档,如果游标为空,则该方法返回false:

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29

  

public abstract boolean moveToFirst()

     

在API级别1中添加将光标移动到第一行。

     

如果光标为空,此方法将返回false

     

返回移动是否成功。

答案 2 :(得分:2)

已删除的记录在SQLite中保留为空记录,但getCount()仅计算非空记录。如果您的表中有一些为空的记录,则某些非空记录的_Id个数字会大于getCount()的结果。要到达它们,您可以将游标(使用for()循环)迭代次数加倍getCount()的结果,并使用游标将record_Id数字填充到数组中。让我们说结果数组是{ 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }

这意味着记录3,4,10,13是空记录,而您的表共有14条记录,而不是10条记录来自getCount()

记住:

  1. getCount()返回非空记录的数量,
  2. cursor返回_Id个非空记录的数量,
  3. _Id光标“遗漏”的数字为_Id个空记录数
  4. 必须远远超过getCount(),才能全部获得。

答案 3 :(得分:1)

您只需要使用getCount()。 如果你的sql是正确的但没有返回任何行,你将有一个NOT null游标对象,但没有行,getCount()将返回0。

答案 4 :(得分:0)

我的建议是使用ListActivity

这些是活动的,用于显示ListView中的项目。您只需使用SimpleCursorAdapter填充它们(也在ListActivity的JavaDoc页面中进行了说明。)

他们还提供setEmptyView()-method,可用于显示View(可能是TextView),告知用户目前还没有记录以及如何创建之一。

可以找到有关如何执行此操作的示例here

答案 5 :(得分:0)

我相信您的问题是您没有创建正确的查询。

您应该使用SQLiteDatabase查询。

Cursor c = db.query(TABLE_NAME, null,
            null, null, null, null, null);

然后,您可以使用c.getCount()来确定表中是否有任何内容。