24

我有一个由以下代码创建的 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,如果表有两个条目,依此类推。

您能否建议一些方法来解决我根据光标是否为空来启动不同活动的问题。

4

6 回答 6

62

像这样测试光标怎么样,然后按照你说的做:

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

获取计数()

返回游标中的行数

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

于 2011-08-28T18:12:36.467 回答
24

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

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

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

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

公共抽象布尔moveToFirst()

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

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

返回移动是否成功。

于 2011-08-28T18:16:28.857 回答
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. 游标返回_Id非空记录的数量,
  3. _Id游标“错过”的_Id数字是空记录的数量,
  4. 必须达到足够远而不是getCount()获得所有这些。
于 2011-11-10T01:41:05.287 回答
2

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

于 2011-08-28T18:38:16.760 回答
0

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

您应该使用 SQLiteDatabase 查询。

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

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

于 2011-09-21T14:04:44.673 回答
0

我的建议是使用ListActivity.

这些是 Activity,旨在显示ListView. 您可以简单地使用 aSimpleCursorAdapter来填充它们(在ListActivitys JavaDoc 页面中也有说明)。

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

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

于 2011-08-28T18:22:33.660 回答