【问题标题】:Cursor wrapping/unwrapping in ContentProviderContentProvider 中的光标包装/展开
【发布时间】:2011-04-27 22:50:34
【问题描述】:

我正在创建 ContentProvider,它是另一个 ContentProvider 的代理(用于安全问题并提供对完整应用程序部分功能的访问权限)。

public class GFContactsProvider extends ContactsProvider implements
      DatabaseConstants {
    private Context mContext;
    private ContentResolver mContentResolver;
    @Override
     public boolean onCreate() {
      mContext = getContext();
      mContentResolver = mContext.getContentResolver();


     }
    @Override
     public Cursor query(Uri uri, String[] projection, String selection,
       String[] selectionArgs, String sortOrder) {

     Cursor result = mContentResolver.query(ContactsContract.getContactsURI(Long.parseLong(address.get(1))), null, null, null, ContactsContract.ContactColumns.SHOW_NAME);  
return result;
     }
    }

从我的 CP 调用内部 CP 后,我收到了意外的异常:

java.lang.UnsupportedOperationException: Only CrossProcessCursor cursors are supported across process for now

这个异常涉及到 CP 对 Cursor 的包装和传输,Outer CP 不能再次包装,所以我这里有问题。当我检查返回光标的类时,我收到了 CursorWrapperInner。

有没有办法在我的外部 CP 中解开光标(从这个 CWI 到常规 Cursor)(但不是通过将所有数据循环传输到 MatrixCursor ——这太耗时了)。

【问题讨论】:

    标签: android android-contentprovider android-cursor


    【解决方案1】:

    据我所知,您无法打开 Cursor,因为包装器类是私有的(可以使用反射,但 SecurityManager 可能不允许这样做),但您可以尝试创建自己的包装器来实现 CrossProcessCursor , 包装返回的游标并由您的 ContentProvider 返回。

    【讨论】:

      【解决方案2】:

      听起来你使用了两个 apk 之类的。您不应该在同一个应用程序中使用不同的 ContentProviders 来实现这一点。当另一个应用程序尝试使用您的 ContentProviders 时,您会收到此错误。解决方案是让您的自定义 Cursor 实现实现 CrossProcessCursor 接口。

      【讨论】:

        【解决方案3】:

        没有必要“解开”光标。问题是,如果您的内容提供者向在另一个进程中运行的客户端提供结果,则您从 query() 返回的 Cursor 必须实现 CrossProcessCursor 接口。文档(AFAICS)中没有说明,但您可以从您的日志中看到这一点。

        您需要做的就是实现 CrossProcessCursor 接口,并将其包裹在您的光标周围。

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

        CrossProcessCursor 方法的实现是从 AbstractCursor 移植的。为了让编译器满意,我们做了一些细微的修改:

        public class CrossProcessCursorWrapper extends CursorWrapper implements
                CrossProcessCursor {
            public CrossProcessCursorWrapper(Cursor cursor) {
                super(cursor);
            }
        
            @Override
            public CursorWindow getWindow() {
                return null;
            }
        
            @Override
            public void fillWindow(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();
                }
            }
        
            @Override
            public boolean onMove(int oldPosition, int newPosition) {
                return true;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-03
          • 2022-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多