FileDocCategorySizeDatePackage
BulkCursorToCursorAdaptor.javaAPI DocAndroid 5.1 API5916Thu Mar 12 22:22:10 GMT 2015android.database

BulkCursorToCursorAdaptor

public final class BulkCursorToCursorAdaptor extends AbstractWindowedCursor
Adapts an {@link IBulkCursor} to a {@link Cursor} for use in the local process. {@hide}

Fields Summary
private static final String
TAG
private SelfContentObserver
mObserverBridge
private IBulkCursor
mBulkCursor
private String[]
mColumns
private boolean
mWantsAllOnMoveCalls
private int
mCount
Constructors Summary
Methods Summary
public voidclose()

        super.close();

        if (mBulkCursor != null) {
            try {
                mBulkCursor.close();
            } catch (RemoteException ex) {
                Log.w(TAG, "Remote process exception when closing");
            } finally {
                mBulkCursor = null;
            }
        }
    
public voiddeactivate()

        // This will call onInvalidated(), so make sure to do it before calling release,
        // which is what actually makes the data set invalid.
        super.deactivate();

        if (mBulkCursor != null) {
            try {
                mBulkCursor.deactivate();
            } catch (RemoteException ex) {
                Log.w(TAG, "Remote process exception when deactivating");
            }
        }
    
public java.lang.String[]getColumnNames()

        throwIfCursorIsClosed();

        return mColumns;
    
public intgetCount()

        throwIfCursorIsClosed();
        return mCount;
    
public android.os.BundlegetExtras()

        throwIfCursorIsClosed();

        try {
            return mBulkCursor.getExtras();
        } catch (RemoteException e) {
            // This should never happen because the system kills processes that are using remote
            // cursors when the provider process is killed.
            throw new RuntimeException(e);
        }
    
public IContentObservergetObserver()
Gets a SelfDataChangeOberserver that can be sent to a remote process to receive change notifications over IPC.

return
A SelfContentObserver hooked up to this Cursor

        return mObserverBridge.getContentObserver();
    
public voidinitialize(BulkCursorDescriptor d)
Initializes the adaptor. Must be called before first use.


                  
        
        mBulkCursor = d.cursor;
        mColumns = d.columnNames;
        mRowIdColumnIndex = DatabaseUtils.findRowIdColumnIndex(mColumns);
        mWantsAllOnMoveCalls = d.wantsAllOnMoveCalls;
        mCount = d.count;
        if (d.window != null) {
            setWindow(d.window);
        }
    
public booleanonMove(int oldPosition, int newPosition)

        throwIfCursorIsClosed();

        try {
            // Make sure we have the proper window
            if (mWindow == null
                    || newPosition < mWindow.getStartPosition()
                    || newPosition >= mWindow.getStartPosition() + mWindow.getNumRows()) {
                setWindow(mBulkCursor.getWindow(newPosition));
            } else if (mWantsAllOnMoveCalls) {
                mBulkCursor.onMove(newPosition);
            }
        } catch (RemoteException ex) {
            // We tried to get a window and failed
            Log.e(TAG, "Unable to get window because the remote process is dead");
            return false;
        }

        // Couldn't obtain a window, something is wrong
        if (mWindow == null) {
            return false;
        }

        return true;
    
public booleanrequery()

        throwIfCursorIsClosed();

        try {
            mCount = mBulkCursor.requery(getObserver());
            if (mCount != -1) {
                mPos = -1;
                closeWindow();

                // super.requery() will call onChanged. Do it here instead of relying on the
                // observer from the far side so that observers can see a correct value for mCount
                // when responding to onChanged.
                super.requery();
                return true;
            } else {
                deactivate();
                return false;
            }
        } catch (Exception ex) {
            Log.e(TAG, "Unable to requery because the remote process exception " + ex.getMessage());
            deactivate();
            return false;
        }
    
public android.os.Bundlerespond(android.os.Bundle extras)

        throwIfCursorIsClosed();

        try {
            return mBulkCursor.respond(extras);
        } catch (RemoteException e) {
            // the system kills processes that are using remote cursors when the provider process
            // is killed, but this can still happen if this is being called from the system process,
            // so, better to log and return an empty bundle.
            Log.w(TAG, "respond() threw RemoteException, returning an empty bundle.", e);
            return Bundle.EMPTY;
        }
    
private voidthrowIfCursorIsClosed()

        if (mBulkCursor == null) {
            throw new StaleDataException("Attempted to access a cursor after it has been closed.");
        }