我设法创建了一个可工作的CursorWrapper
,但当我想在多个进程中使用我的ContentProvider
时,就陷入了困境。
这些帖子甚至展示了如何实现CrossProcessCursor
接口,特别是硬的和未记录的fillWindow()
方法:
-
在自定义ContentProvider';s的fillWindow()方法?
-
通过内容提供商传递二进制blob
问题是,我只能想到fillWindow()
的一个实现,它处理一个游标,该游标的所有列都包含Blob、Strings或。。。,但不是像现实世界中的光标所必然具有的那样,将这些混合在一起。这里真正的问题是缺少getType()
函数(仅从v11开始存在)、或getRaw()
/putRaw()
,它们只会复制二进制文件而不会抱怨。如何在返回的游标值中不产生不必要的转换的情况下处理?
目前我已经按如下方式实现了它,但它感觉不太合适或健壮:
/**
* Copy data from cursor to CursorWindow
* @param position start position of data
* @param window
*/
public void fillWindow(int position, CursorWindow window) {
if (position < 0 || position > getCount()) {
return;
}
window.acquireReference();
try {
int oldpos = this.getPosition();
this.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++) {
//int type = getType(i);//only from v11 on
try {
String field7 = getString(i);
if (field7 != null) {
try {
if (!window.putLong(new Long(field7), this.getPosition(), i)) {
if (!window.putDouble(new Double(field7), this.getPosition(), i)) {
if (!window.putString(field7, this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
}
} catch (NumberFormatException e) {
try {
if (!window.putDouble(new Double(field7), this.getPosition(), i)) {
if (!window.putString(field7, this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
} catch (NumberFormatException e1) {
if (!window.putString(field7, this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
}
} else {
if (!window.putNull(this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
} catch (SQLiteException e7) {
try {
byte[] field1 = getBlob(i);
if (field1 != null) {
if (!window.putBlob(field1, this.getPosition(), i)) {
window.freeLastRow();
break;
}
} else {
if (!window.putNull(this.getPosition(), i)) {
window.freeLastRow();
break;
}
}
} catch (SQLiteException e1) {
throw e1;
}
}
}
}
this.moveToPosition(oldpos);
} catch (IllegalStateException e){
// simply ignore it
} finally {
window.releaseReference();
}
}