Skip to content Skip to sidebar Skip to footer

Cursor Wrapping/unwrapping In Contentprovider

I'm creating ContentProvider which is a proxy of another ContentProvider (for security issues and to give access to part of functionality of full app). public class GFContactsProv

Solution 1:

There's no need to "unwrap" the cursor. The problem is, if your content provider is providing results to a client that runs in another process, the Cursor you returned from query() must implement CrossProcessCursor interface. It's not stated in document (AFAICS), but you can see this from your log.

All you need to do is implement CrossProcessCursor interface, and wrap it around your cursor.

// your query statement does not seem right..BTWCursorresult= mContentResolver.query(...); 
// now, you return a CrossProcessCursorWrapper.returnnewCrossProcessCursorWrapper(result);

Implementation of CrossProcessCursor methods are ported from AbstractCursor. Some slight modifications are made so the compiler's happy:

publicclassCrossProcessCursorWrapperextendsCursorWrapperimplementsCrossProcessCursor {
    publicCrossProcessCursorWrapper(Cursor cursor) {
        super(cursor);
    }

    @OverridepublicCursorWindowgetWindow() {
        returnnull;
    }

    @OverridepublicvoidfillWindow(int position, CursorWindow window) {
        if (position < 0 || position > getCount()) {
            return;
        }
        window.acquireReference();
        try {
            moveToPosition(position - 1);
            window.clear();
            window.setStartPosition(position);
            int columnNum = getColumnCount();
            window.setNumColumns(columnNum);
            while (moveToNext() && window.allocRow()) {
                for (int i = 0; i < columnNum; i++) {
                    String field = getString(i);
                    if (field != null) {
                        if (!window.putString(field, getPosition(), i)) {
                            window.freeLastRow();
                            break;
                        }
                    } else {
                        if (!window.putNull(getPosition(), i)) {
                            window.freeLastRow();
                            break;
                        }
                    }
                }
            }
        } catch (IllegalStateException e) {
            // simply ignore it
        } finally {
            window.releaseReference();
        }
    }

    @OverridepublicbooleanonMove(int oldPosition, int newPosition) {
        returntrue;
    }
}

Solution 2:

Sounds like you use two apk's or something. You shouldn't get this with different ContentProviders using eachother within the same application. When another application tries to use your ContentProviders however you get this error. Solution is to let your custom Cursor implementation implement the CrossProcessCursor interface.

Solution 3:

As far as I know you can't unwrap the Cursor because the wrapper class is private (it could be possible using reflections but the SecurityManager won't allow it probably) but you could try to create your own wrapper which implements CrossProcessCursor, wraps the returned cursor and is returned by your ContentProvider.

Post a Comment for "Cursor Wrapping/unwrapping In Contentprovider"