/** update the level and count for the given flashcard in the database. */
  private void updateFlashcard(Flashcard fc) {
    openDB();

    _curDB.beginTransaction();
    try {
      // Delete old entry if any.
      SQLiteStatement dStmt = getCompiledStatement(SQL_DELETE_FCS);
      dStmt.bindString(1, fc.getLang1Str());
      dStmt.execute();

      // insert new state entry.
      SQLiteStatement iStmt = getCompiledStatement(SQL_INSERT_FCS);
      iStmt.bindString(1, fc.getLang1Str());
      iStmt.bindLong(2, fc.getLevel());
      iStmt.bindLong(3, fc.getRightGuessCount());
      iStmt.execute();
      _curDB.setTransactionSuccessful();
    } catch (SQLException e) {
      MsgDispatcher.sendMessageToUI(
          MsgType.MSG_SHOW_ERROR_MSG, 0, 0, "unable to update id=" + fc.getID());
    } finally {
      _curDB.endTransaction();
    }

    // this flashcard is no longer used by anyone so release it.
    fc.release();
  }
  /**
   * handle a vertical or horizontal fling from within this Activity. If we have only shown the
   * first half of the current card so far, then the second half is shown to the user. Otherwise, a
   * new card is displayed.
   *
   * <p>Called by {@link AxialFlingListener} when it detects a vertical or horizontal fling.
   */
  private void handleFling(boolean isCorrectGuess) {
    if (FlashcardApp.getInstance().isShowEntireCard()) {
      // if we are already waiting for a card, ignore extra fling.
      if (_waitingForNextCard) {
        return;
      }
      _waitingForNextCard = true;

      MsgDispatcher.sendMessageToController(MsgType.MSG_GET_NEXT_FC, 0, 0, null);

      Flashcard fc = FlashcardApp.getInstance().getCurrentFlashcard();
      if (fc != null) {
        // save current fc as the previous fc. must clone it as the one
        // we send to update guess count may be released soon.
        if (_prevFlashcard != null) _prevFlashcard.release();
        _prevFlashcard = fc.clone();

        int arg1 = isCorrectGuess ? 1 : 0;
        MsgDispatcher.sendMessageToController(MsgType.MSG_FC_GUESS_RESULT, arg1, 0, fc);
      }
    } else {
      FlashcardApp.getInstance().setShowEntireCard(true);
      updateDisplay();
    }
  }