Android:向已填充的Cursor添加列

时间:2014-07-09 04:11:21

标签: android android-cursor mergecursor

我对是否使用MergeCursor或CursorJoiner感到困惑。

我有一个光标(A),其中包含大量数据。假设Cursor(A)和3列有100行。我想要做的是向Cursor插入(追加)一个新列,以便生成的Cursor(B)有100行但是4列。

此时此刻,我希望第4列包含100行的默认值。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以在此处使用Decorator pattern

为此,Android具有CursorWrapper,这是一个...

  

Cursor的包装程序类,它将所有调用委派给实际的光标对象。此类的主要用途是在扩展游标的同时仅覆盖其方法的一部分。

假设您的新列名为newColumn,并且其类型为String,那么您可以按照以下步骤进行操作:

class MyCursorWrapper extends CursorWrapper {
    private final String NEW_COLUMN = "newColumn";

    @Override
    public int getColumnCount() {
        // Count the virtual column in
        return getWrappedCursor().getColumnCount() + 1;
    }

    @Override
    public int getColumnIndex(String columnName) {
        // Return the virtual column if they are asking for it,
        // otherwise just use the original 
        if (columnName != null && columnName.equals("newColumn") {
            return getWrappedCursor().getColumnCount();
        }
        return mCursor.getColumnIndex(columnName);
    }

    public int getColumnIndexOrThrow(String columnName)
            throws IllegalArgumentException {
        // Same logic as getColumnIndex()
        if (columnName != null && columnName.equals(NEW_COLUMN) {
            return getWrappedCursor().getColumnCount();
        }
        return getWrappedCursor.getColumnIndexOrThrow(columnName);
    }

    @Override
    public String getColumnName(int columnIndex) {
         if (columnIndex == getWrappedCursor.getColumnCount()) {
             return NEW_COLUMN;
         }
         return getWrappedCursor().getColumnName(columnIndex);
    }

    @Override
    public String[] getColumnNames() {
        // Add our virtual column to the result from the original Cursor
        String original = getWrappedCursor().getColumnNames()
        String result = new String[original.length + 1];
        System.arrayCopy(original, 0, result, 0, original.length);
        result[original.length] = NEW_COLUMN;
        return result;
    }

    @Override
    public String getString(int columnIndex) {
        // For the last column, return whatever you need to return here
        // For real columns, just delegate to the original Cursor
        if (columnIndex == getWrappedCursor().getColumnCount()) {
            return yourResultHere();
        }
        return getWrappedCursor().getString(columnIndex);
    }
}