FileDocCategorySizeDatePackage
AbstractCursor.javaAPI DocAndroid 5.1 API14131Thu Mar 12 22:22:10 GMT 2015android.database

AbstractCursor

public abstract class AbstractCursor extends Object implements CrossProcessCursor
This is an abstract cursor class that handles a lot of the common code that all cursors need to deal with and is provided for convenience reasons.

Fields Summary
private static final String
TAG
protected HashMap
mUpdatedRows
protected int
mPos
protected int
mRowIdColumnIndex
This must be set to the index of the row ID column by any subclass that wishes to support updates.
protected Long
mCurrentRowID
If {@link #mRowIdColumnIndex} is not -1 this contains contains the value of the column at {@link #mRowIdColumnIndex} for the current row this cursor is pointing at.
protected boolean
mClosed
protected android.content.ContentResolver
mContentResolver
private android.net.Uri
mNotifyUri
private final Object
mSelfObserverLock
private ContentObserver
mSelfObserver
private boolean
mSelfObserverRegistered
private final DataSetObservable
mDataSetObservable
private final ContentObservable
mContentObservable
private android.os.Bundle
mExtras
Constructors Summary
public AbstractCursor()

        mPos = -1;
        mRowIdColumnIndex = -1;
        mCurrentRowID = null;
        mUpdatedRows = new HashMap<Long, Map<String, Object>>();
    
Methods Summary
protected voidcheckPosition()
This function throws CursorIndexOutOfBoundsException if the cursor position is out of bounds. Subclass implementations of the get functions should call this before attempting to retrieve data.

throws
CursorIndexOutOfBoundsException

        if (-1 == mPos || getCount() == mPos) {
            throw new CursorIndexOutOfBoundsException(mPos, getCount());
        }
    
public voidclose()

        mClosed = true;
        mContentObservable.unregisterAll();
        onDeactivateOrClose();
    
public voidcopyStringToBuffer(int columnIndex, CharArrayBuffer buffer)

        // Default implementation, uses getString
        String result = getString(columnIndex);
        if (result != null) {
            char[] data = buffer.data;
            if (data == null || data.length < result.length()) {
                buffer.data = result.toCharArray();
            } else {
                result.getChars(0, result.length(), data, 0);
            }
            buffer.sizeCopied = result.length();
        } else {
            buffer.sizeCopied = 0;
        }
    
public voiddeactivate()

        onDeactivateOrClose();
    
public voidfillWindow(int position, CursorWindow window)

        DatabaseUtils.cursorFillWindow(this, position, window);
    
protected voidfinalize()

        if (mSelfObserver != null && mSelfObserverRegistered == true) {
            mContentResolver.unregisterContentObserver(mSelfObserver);
        }
        try {
            if (!mClosed) close();
        } catch(Exception e) { }
    
public byte[]getBlob(int column)

        throw new UnsupportedOperationException("getBlob is not supported");
    
public intgetColumnCount()

        return getColumnNames().length;
    
public intgetColumnIndex(java.lang.String columnName)

        // Hack according to bug 903852
        final int periodIndex = columnName.lastIndexOf('.");
        if (periodIndex != -1) {
            Exception e = new Exception();
            Log.e(TAG, "requesting column name with table name -- " + columnName, e);
            columnName = columnName.substring(periodIndex + 1);
        }

        String columnNames[] = getColumnNames();
        int length = columnNames.length;
        for (int i = 0; i < length; i++) {
            if (columnNames[i].equalsIgnoreCase(columnName)) {
                return i;
            }
        }

        if (false) {
            if (getCount() > 0) {
                Log.w("AbstractCursor", "Unknown column " + columnName);
            }
        }
        return -1;
    
public intgetColumnIndexOrThrow(java.lang.String columnName)

        final int index = getColumnIndex(columnName);
        if (index < 0) {
            throw new IllegalArgumentException("column '" + columnName + "' does not exist");
        }
        return index;
    
public java.lang.StringgetColumnName(int columnIndex)

        return getColumnNames()[columnIndex];
    
public abstract java.lang.String[]getColumnNames()

public abstract intgetCount()

public abstract doublegetDouble(int column)

public android.os.BundlegetExtras()

        return mExtras;
    
public abstract floatgetFloat(int column)

public abstract intgetInt(int column)

public abstract longgetLong(int column)

public android.net.UrigetNotificationUri()

        synchronized (mSelfObserverLock) {
            return mNotifyUri;
        }
    
public final intgetPosition()

        return mPos;
    
public abstract shortgetShort(int column)

public abstract java.lang.StringgetString(int column)

public intgetType(int column)


    /* -------------------------------------------------------- */
    /* These need to be implemented by subclasses */
       

       

        
        
        
        
        
        
        

        
        // Reflects the assumption that all commonly used field types (meaning everything
        // but blobs) are convertible to strings so it should be safe to call
        // getString to retrieve them.
        return FIELD_TYPE_STRING;
    
protected java.lang.ObjectgetUpdatedField(int columnIndex)

deprecated
Always returns null since Cursors do not support updating rows

        return null;
    
public booleangetWantsAllOnMoveCalls()

        return false;
    
public CursorWindowgetWindow()
If the cursor is backed by a {@link CursorWindow}, returns a pre-filled window with the contents of the cursor, otherwise null.

return
The pre-filled window that backs this cursor, or null if none.

        return null;
    
public final booleanisAfterLast()

        if (getCount() == 0) {
            return true;
        }
        return mPos == getCount();
    
public final booleanisBeforeFirst()

        if (getCount() == 0) {
            return true;
        }
        return mPos == -1;
    
public booleanisClosed()

        return mClosed;
    
protected booleanisFieldUpdated(int columnIndex)

deprecated
Always returns false since Cursors do not support updating rows

        return false;
    
public final booleanisFirst()

        return mPos == 0 && getCount() != 0;
    
public final booleanisLast()

        int cnt = getCount();
        return mPos == (cnt - 1) && cnt != 0;
    
public abstract booleanisNull(int column)

public final booleanmove(int offset)

        return moveToPosition(mPos + offset);
    
public final booleanmoveToFirst()

        return moveToPosition(0);
    
public final booleanmoveToLast()

        return moveToPosition(getCount() - 1);
    
public final booleanmoveToNext()

        return moveToPosition(mPos + 1);
    
public final booleanmoveToPosition(int position)

        // Make sure position isn't past the end of the cursor
        final int count = getCount();
        if (position >= count) {
            mPos = count;
            return false;
        }

        // Make sure position isn't before the beginning of the cursor
        if (position < 0) {
            mPos = -1;
            return false;
        }

        // Check for no-op moves, and skip the rest of the work for them
        if (position == mPos) {
            return true;
        }

        boolean result = onMove(mPos, position);
        if (result == false) {
            mPos = -1;
        } else {
            mPos = position;
            if (mRowIdColumnIndex != -1) {
                mCurrentRowID = Long.valueOf(getLong(mRowIdColumnIndex));
            }
        }

        return result;
    
public final booleanmoveToPrevious()

        return moveToPosition(mPos - 1);
    
protected voidonChange(boolean selfChange)
Subclasses must call this method when they finish committing updates to notify all observers.

param
selfChange

        synchronized (mSelfObserverLock) {
            mContentObservable.dispatchChange(selfChange, null);
            if (mNotifyUri != null && selfChange) {
                mContentResolver.notifyChange(mNotifyUri, mSelfObserver);
            }
        }
    
protected voidonDeactivateOrClose()

hide

        if (mSelfObserver != null) {
            mContentResolver.unregisterContentObserver(mSelfObserver);
            mSelfObserverRegistered = false;
        }
        mDataSetObservable.notifyInvalidated();
    
public booleanonMove(int oldPosition, int newPosition)
This function is called every time the cursor is successfully scrolled to a new position, giving the subclass a chance to update any state it may have. If it returns false the move function will also do so and the cursor will scroll to the beforeFirst position.

param
oldPosition the position that we're moving from
param
newPosition the position that we're moving to
return
true if the move is successful, false otherwise

        return true;
    
public voidregisterContentObserver(ContentObserver observer)

        mContentObservable.registerObserver(observer);
    
public voidregisterDataSetObserver(DataSetObserver observer)

        mDataSetObservable.registerObserver(observer);
    
public booleanrequery()

        if (mSelfObserver != null && mSelfObserverRegistered == false) {
            mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver);
            mSelfObserverRegistered = true;
        }
        mDataSetObservable.notifyChanged();
        return true;
    
public android.os.Bundlerespond(android.os.Bundle extras)

        return Bundle.EMPTY;
    
public voidsetExtras(android.os.Bundle extras)
Sets a {@link Bundle} that will be returned by {@link #getExtras()}. null will be converted into {@link Bundle#EMPTY}.

param
extras {@link Bundle} to set.
hide

        mExtras = (extras == null) ? Bundle.EMPTY : extras;
    
public voidsetNotificationUri(android.content.ContentResolver cr, android.net.Uri notifyUri)
Specifies a content URI to watch for changes.

param
cr The content resolver from the caller's context.
param
notifyUri The URI to watch for changes. This can be a specific row URI, or a base URI for a whole class of content.

        setNotificationUri(cr, notifyUri, UserHandle.myUserId());
    
public voidsetNotificationUri(android.content.ContentResolver cr, android.net.Uri notifyUri, int userHandle)

hide
- set the notification uri but with an observer for a particular user's view

        synchronized (mSelfObserverLock) {
            mNotifyUri = notifyUri;
            mContentResolver = cr;
            if (mSelfObserver != null) {
                mContentResolver.unregisterContentObserver(mSelfObserver);
            }
            mSelfObserver = new SelfContentObserver(this);
            mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver, userHandle);
            mSelfObserverRegistered = true;
        }
    
public voidunregisterContentObserver(ContentObserver observer)

        // cursor will unregister all observers when it close
        if (!mClosed) {
            mContentObservable.unregisterObserver(observer);
        }
    
public voidunregisterDataSetObserver(DataSetObserver observer)

        mDataSetObservable.unregisterObserver(observer);