19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.database;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A mutable cursor implementation backed by an array of {@code Object}s. Use
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #newRow()} to add rows. Automatically expands internal capacity
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as needed.
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MatrixCursor extends AbstractCursor {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String[] columnNames;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Object[] data;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int rowCount = 0;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int columnCount;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructs a new cursor with the given initial capacity.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param columnNames names of the columns, the ordering of which
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  determines column ordering elsewhere in this cursor
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param initialCapacity in rows
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MatrixCursor(String[] columnNames, int initialCapacity) {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.columnNames = columnNames;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.columnCount = columnNames.length;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (initialCapacity < 1) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            initialCapacity = 1;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.data = new Object[columnCount * initialCapacity];
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructs a new cursor.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param columnNames names of the columns, the ordering of which
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  determines column ordering elsewhere in this cursor
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public MatrixCursor(String[] columnNames) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(columnNames, 16);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets value at the given column for the current row.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Object get(int column) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (column < 0 || column >= columnCount) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CursorIndexOutOfBoundsException("Requested column: "
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + column + ", # of columns: " +  columnCount);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPos < 0) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CursorIndexOutOfBoundsException("Before first row.");
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPos >= rowCount) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CursorIndexOutOfBoundsException("After last row.");
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data[mPos * columnCount + column];
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adds a new row to the end and returns a builder for that row. Not safe
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for concurrent use.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return builder which can be used to set the column values for the new
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  row
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RowBuilder newRow() {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rowCount++;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int endIndex = rowCount * columnCount;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ensureCapacity(endIndex);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int start = endIndex - columnCount;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new RowBuilder(start, endIndex);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adds a new row to the end with the given column values. Not safe
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for concurrent use.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if {@code columnValues.length !=
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  columnNames.length}
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param columnValues in the same order as the the column names specified
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  at cursor construction time
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addRow(Object[] columnValues) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (columnValues.length != columnCount) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("columnNames.length = "
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + columnCount + ", columnValues.length = "
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + columnValues.length);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int start = rowCount++ * columnCount;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ensureCapacity(start + columnCount);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.arraycopy(columnValues, 0, data, start, columnCount);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adds a new row to the end with the given column values. Not safe
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for concurrent use.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalArgumentException if {@code columnValues.size() !=
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  columnNames.length}
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param columnValues in the same order as the the column names specified
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  at cursor construction time
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addRow(Iterable<?> columnValues) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int start = rowCount * columnCount;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int end = start + columnCount;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ensureCapacity(end);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (columnValues instanceof ArrayList<?>) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addRow((ArrayList<?>) columnValues, start);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int current = start;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object[] localData = data;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object columnValue : columnValues) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current == end) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO: null out row?
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException(
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "columnValues.size() > columnNames.length");
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            localData[current++] = columnValue;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (current != end) {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: null out row?
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "columnValues.size() < columnNames.length");
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Increase row count here in case we encounter an exception.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rowCount++;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Optimization for {@link ArrayList}. */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addRow(ArrayList<?> columnValues, int start) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = columnValues.size();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (size != columnCount) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("columnNames.length = "
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + columnCount + ", columnValues.size() = " + size);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rowCount++;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object[] localData = data;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            localData[start + i] = columnValues.get(i);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Ensures that this cursor has enough capacity. */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void ensureCapacity(int size) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (size > data.length) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Object[] oldData = this.data;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int newSize = data.length * 2;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newSize < size) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newSize = size;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.data = new Object[newSize];
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.arraycopy(oldData, 0, this.data, 0, oldData.length);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Builds a row, starting from the left-most column and adding one column
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value at a time. Follows the same ordering as the column names specified
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at cursor construction time.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public class RowBuilder {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int index;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int endIndex;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RowBuilder(int index, int endIndex) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.index = index;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.endIndex = endIndex;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the next column value in this row.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @throws CursorIndexOutOfBoundsException if you try to add too many
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  values
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return this builder to support chaining
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public RowBuilder add(Object columnValue) {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == endIndex) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new CursorIndexOutOfBoundsException(
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "No more columns left.");
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data[index++] = columnValue;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // AbstractCursor implementation.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
217f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getCount() {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rowCount;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
222f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getColumnNames() {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return columnNames;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
227f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int column) {
229f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        Object value = get(column);
230f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value == null) return null;
231f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        return value.toString();
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
234f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public short getShort(int column) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object value = get(column);
237f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value == null) return 0;
238f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value instanceof Number) return ((Number) value).shortValue();
239f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        return Short.parseShort(value.toString());
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
242f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getInt(int column) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object value = get(column);
245f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value == null) return 0;
246f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value instanceof Number) return ((Number) value).intValue();
247f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        return Integer.parseInt(value.toString());
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
250f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getLong(int column) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object value = get(column);
253f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value == null) return 0;
254f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value instanceof Number) return ((Number) value).longValue();
255f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        return Long.parseLong(value.toString());
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
258f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getFloat(int column) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object value = get(column);
261f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value == null) return 0.0f;
262f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value instanceof Number) return ((Number) value).floatValue();
263f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        return Float.parseFloat(value.toString());
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
266f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getDouble(int column) {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object value = get(column);
269f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value == null) return 0.0d;
270f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        if (value instanceof Number) return ((Number) value).doubleValue();
271f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert        return Double.parseDouble(value.toString());
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
274f2cec58d90381c05033f26add5693252e68f48f9Bjorn Bringert    @Override
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isNull(int column) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return get(column) == null;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
279