0

宿題の To-Do アプリを開発していて、宿題の横に教授の連絡先情報を表示したいと考えています。各割り当てには、クラス テーブルへの外部キーであるクラス ID 値があり、このクラス テーブルには、私が探している情報を含む教授テーブルへの外部キーがあります。このコードは機能するはずですが、結果が返されません。

クエリコードは次のとおりです。

文字列 selectQuery = "SELECT " + KEY_CLASS_PROF +" FROM " + TABLE_CLASS + " , " + TABLE_ASSGN + " WHERE " + KEY_CLASS_ID + " = " + KEY_ASSGN_CLASS + " AND "+ KEY_ASSGN_ID + " = " + assgn_id;

  Log.d(LOG, selectQuery);

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, null);

    if (c == null)
      Log.d(LOG,"c is null! Why is c null?");

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

      Log.d(LOG,"Cursor" + c.getPosition());

      thisProf = c.getInt(c.getColumnIndex(KEY_CLASS_PROF));

      Log.d(LOG,"thisProf is " + thisProf);


    } else Log.d(LOG,"returned null!");

および結果のログ:

11-12 21:51:14.508: D/DatabaseHelper(622): SELECT * FROM ClassTable , AssignmentTable WHERE classid = fk_classid AND assignmentid = 2

11-12 21:51:14.508: D/DatabaseHelper(622): null が返されました!

したがって、 c は null ではありませんが、 (c != null && c.moveToFirst()) は false を返します。これは私を夢中にさせています。どんな助けでも大歓迎です。

編集:私はそれを理解しました.0の結果が返されたことが判明したため、 c がnullではなかったとしても、移動する最初の結果がなかったため、 c.moveToFirst() は false でした!

4

2 に答える 2

1

クエリ構文を変更して、結果が次のようになるようにする必要があります。

SELECT * FROM ClassTable C join AssignmentTable A ON C.classid =
A.fk_classid  WHERE assignmentid = 2
于 2013-11-13T03:12:03.667 に答える
0

オブジェクトが であると同時にnullでないnullことはあり得ません。これは不可能です。あなたのロジックを見てみましょう:

Cursor c = db.rawQuery(selectQuery, null); //you initialize the query (it isn't null now)

if (c == null) //right here you are checking if it is null or not


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

   //right here you have checked to make sure it isn't null AND that the
   //cursor found your query

} else Log.d(LOG,"returned null!");
   //this executes if either c == null or c cannot move to the first item (which
   //means that your query was either wrong, or turned up no results. if c was
   //actually null, your check at the top would evaluate true.

あなたは単にc.moveToFirst()意味を誤解しているだけです(クエリしたものが見つかったということです)。カーソルは null ではなく、まだ何も見つからない可能性があります。初期化していない場合にのみ null になります。中間の if ステートメントは実行されず、最初のステートメントも実行されないため、c が null ではないことがわかりますが、クエリが空になり、c が最初に移動できませんでした (クエリが空になったため)。 .

あなたの見ているものが少し明確になったことを願っています。クエリしているデータがそこにないか、間違ってクエリを実行しています。投稿された他の回答が解決に役立つはずです。

于 2013-11-13T03:45:33.403 に答える