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 を開始する必要があることです。

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

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));
    }
}

しかし、ログは、テーブルが空の場合は 1 を示し、テーブルにエントリが 1 つある場合は 1 を示し、テーブルにエントリが 2 つある場合は 2 を示します。

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

4

6 に答える 6

62

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

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

getCount()

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

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

public 抽象ブール値 moveToFirst ()

API レベル 1 で追加 カーソルを最初の行に移動します。

カーソルが空の場合、このメソッドは false を返します

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

于 2011-08-28T18:16:28.857 に答える
2

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

于 2011-08-28T18:38:16.760 に答える
2

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

つまり、レコード 3、4、10、13 は null レコードであり、テーブルには から取得した 10 ではなく、合わせて 14 のレコードがありますgetCount()

覚えて:

  1. getCount()null 以外のレコードの数を返します。
  2. カーソルは_Idnull 以外のレコードの数を返します。
  3. _Idカーソルによって「見逃された」_Id数は、null レコードの数です。
  4. getCount()それらすべてを取得するよりも十分に遠くまで到達する必要があります。
于 2011-11-10T01:41:05.287 に答える
0

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

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

setEmptyView()-methodも提供します。これは、ユーザーにまだレコードがないこととレコードを作成する方法を通知するa View(の場合もある)を表示するために使用できます。TextView

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

于 2011-08-28T18:22:33.660 に答える
0

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

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

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

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

于 2011-09-21T14:04:44.673 に答える