gpt4 book ai didi

android - ContentProvider 中的光标包装/展开

转载 作者:IT老高 更新时间:2023-10-28 23:13:12 25 4
gpt4 key购买 nike

我正在创建 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 ——这太耗时了)。

最佳答案

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

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

// 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;
}
}

关于android - ContentProvider 中的光标包装/展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3976515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com