Как реализовать CrossProcessCursor совместимый универсальный пользовательский CursorWrapper

1

Мне удается создать рабочий CursorWrapper, но застрять, когда я хочу использовать ContentProvider для всех процессов.

Эти сообщения даже показывают, как реализовать интерфейс CrossProcessCursor, особенно метод жесткого и недокументированного fillWindow():

Проблема заключается в том, что я могу думать только о реализации fillWindow(), которая имеет дело с курсором либо с любыми столбцами, содержащими Blobs, либо с строками, либо..., но не сочетание этих, так как существует курсор real-. Реальная проблема здесь заключается в отсутствии функции getType() (существует только с v11 on) или getRaw()/putRaw(), которая просто копирует двоичный файл без жалоб. Как вы справляетесь с этим без внесения нежелательных преобразований в возвращаемые значения курсора?

Теги:
cursor
wrapper

1 ответ

0
Лучший ответ

Я реализовал его следующим образом, но это не похоже на правильную вещь или надежную:

/**
 * 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();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню