如何实现与CrossProcessCursor兼容的通用自定义CursorWrapper



我设法创建了一个可工作的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();
    }
}

相关内容

  • 没有找到相关文章

最新更新