web-dev-qa-db-ja.com

SQLiteDatabaseクエリでカーソルが空かどうかをテストする方法

次のコードで作成された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を開始する必要があることです。

テーブルが空かどうかを教えてくれるメソッドを見つけることができません。次のようにログを使用しようとしました:

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つのエントリがある場合は2が表示されます。

カーソルが空かどうかに基づいて異なるアクティビティを開始するという私の問題を解決する方法を提案できますか。

23
Waneya Iqbal

次のようにカーソルをテストしてから、あなたが言ったことをするのはどうですか:

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

getCount()

カーソルの行数を返します

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

57

空のカーソルをテストする最も簡単でクリーンな方法は、次のコードです。

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を返します

移動が成功したかどうかを返します。

24
SBerg413

削除されたレコードはSQLiteにNULLレコードとして残りますが、getCount()はNULLレコードのみをカウントしません。テーブルにnullのレコードがある場合、nullでないレコードの一部には、getCount()の結果よりも大きい__Id_番号が含まれます。それらに到達するには、カーソルを(for()ループを使用して)getCount()の結果の2倍の回数繰り返し、カーソルを使用してrecord_Id番号を配列に入力します。結果の配列が_{ 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }_であるとしましょう。

つまり、レコード3、4、10、13はNULLレコードであり、テーブルにはgetCount()から取得した10レコードではなく、14レコードがすべて含まれています。

覚えておいてください:

  1. getCount()は、nullでないレコードの数を返します。
  2. カーソルは__Id_の非NULLレコードの数を返します。
  3. カーソルによって「欠落」した__Id_番号は、nullレコードの__Id_番号です。
  4. それらをすべて取得するには、getCount()よりも十分に遠くに到達する必要があります。
2
Stan

GetCount()を使用するだけです。 SQLは正しいが、行を返さない場合、NOT NULLカーソルオブジェクトがありますが、行はなく、getCount()は0を返します。

1
Minolan

問題は、適切なクエリを作成していないことだと思います。

SQLiteDatabaseクエリを使用する必要があります。

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

その後、c.getCount()を使用して、テーブルに何かがあるかどうかを判別できます。

0
AndroidDebaser

私の提案は、 ListActivity を使用することです。

これらは、ListViewのアイテムを表示するためのアクティビティです。単純に SimpleCursorAdapter を使用して、それらにデータを入力できます(ListActivitys JavaDocページにも示されています)。

また、 setEmptyView()- method も提供します。これは、ViewTextViewの場合があります)を表示するために使用できます。 1。

その方法の例は here にあります。

0
Lukas Knuth