public boolean previous() throws SQLException {
      if (getType() == ResultSet.TYPE_FORWARD_ONLY) {
         throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.last").toString());
      }
      /*
       * make sure things look sane. The cursor must be
       * positioned in the rowset or before first (0) or
       * after last (numRows + 1)
       */
      if (cursorPos < 0 || cursorPos > numRows + 1) {
         throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalidcp").toString());
      }
      // move and notify
      boolean ret = this.internalPrevious();
      notifyCursorMoved();

      return ret;
   }
Moves this <code>StreamingRowSetImpl</code> object's cursor to the
previous row and returns <code>true</code> if the cursor is on
a valid row or <code>false</code> if it is not.
This method also notifies all listeners registered with this
<code>StreamingRowSetImpl</code> object that its cursor has moved.
<P>
Note: calling the method <code>previous()</code> is not the same
as calling the method <code>relative(-1)</code>.  This is true
because it is possible to call <code>previous()</code> from the insert
row, from after the last row, or from the current row, whereas
<code>relative</code> may only be called from the current row.
<P>
The method <code>previous</code> may used in a <code>while</code>
loop to iterate through a rowset starting after the last row
and moving toward the beginning. The loop ends when <code>previous</code>
returns <code>false</code>, meaning that there are no more rows.
For example, the following code fragment retrieves all the data in
the <code>StreamingRowSetImpl</code> object <code>crs</code>, which has
three columns.  Note that the cursor must initially be positioned
after the last row so that the first call to the method
<code>previous</code> places the cursor on the last line.
<PRE> <code>

    crs.afterLast();
    while (previous()) {
        String name = crs.getString(1);
        int age = crs.getInt(2);
        short ssn = crs.getShort(3);
        System.out.println(name + "   " + age + "   " + ssn);
    }

</code> </PRE>
This method throws an <code>SQLException</code> if the cursor is not
on a row in the rowset, before the first row, or after the last row.

@return <code>true</code> if the cursor is on a valid row;
        <code>false</code> if it is before the first row or after the
        last row
@throws SQLException if the cursor is not on a valid position or the
          type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
src/main/java/org/replicadb/rowset/StreamingRowSetImpl.java