19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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
19d2183654e03d589b120467f4e98da1b178ceeadbJeff Brownimport dalvik.system.CloseGuard;
20d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown
2134ad57f0e844cd97f59d4ab22087d60d58650ba4Vasu Noriimport android.content.res.Resources;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteClosable;
233bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brownimport android.database.sqlite.SQLiteException;
246141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noriimport android.os.Binder;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
276141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noriimport android.os.Process;
286141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noriimport android.util.Log;
296141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noriimport android.util.SparseIntArray;
30738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhatimport android.util.LongSparseArray;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A buffer containing multiple cursor rows.
340cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown * <p>
355e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown * A {@link CursorWindow} is read-write when initially created and used locally.
365e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown * When sent to a remote process (by writing it to a {@link Parcel}), the remote process
370cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown * receives a read-only view of the cursor window.  Typically the cursor window
380cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown * will be allocated by the producer, filled with data, and then sent to the
390cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown * consumer for reading.
400cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown * </p>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class CursorWindow extends SQLiteClosable implements Parcelable {
436141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    private static final String STATS_TAG = "CursorWindowStats";
446141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori
451ec4f360605ff62c618ca63368a278cddd0e8a74yingying    // This static member will be evaluated when first used.
461ec4f360605ff62c618ca63368a278cddd0e8a74yingying    private static int sCursorWindowSize = -1;
4734ad57f0e844cd97f59d4ab22087d60d58650ba4Vasu Nori
483bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    /**
493bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The native CursorWindow object pointer.  (FOR INTERNAL USE ONLY)
503bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @hide
516141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori     */
52738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    public long mWindowPtr;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mStartPos;
55650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    private final String mName;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown    private final CloseGuard mCloseGuard = CloseGuard.get();
58d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown
59738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native long nativeCreate(String name, int cursorWindowSize);
60738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native long nativeCreateFromParcel(Parcel parcel);
61738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native void nativeDispose(long windowPtr);
62738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native void nativeWriteToParcel(long windowPtr, Parcel parcel);
633bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
64738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native void nativeClear(long windowPtr);
653bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
66738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native int nativeGetNumRows(long windowPtr);
67738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativeSetNumColumns(long windowPtr, int columnNum);
68738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativeAllocRow(long windowPtr);
69738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native void nativeFreeLastRow(long windowPtr);
703bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
71738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native int nativeGetType(long windowPtr, int row, int column);
72738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native byte[] nativeGetBlob(long windowPtr, int row, int column);
73738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native String nativeGetString(long windowPtr, int row, int column);
74738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native long nativeGetLong(long windowPtr, int row, int column);
75738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native double nativeGetDouble(long windowPtr, int row, int column);
76738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native void nativeCopyStringToBuffer(long windowPtr, int row, int column,
773bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            CharArrayBuffer buffer);
783bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
79738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativePutBlob(long windowPtr, byte[] value, int row, int column);
80738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativePutString(long windowPtr, String value, int row, int column);
81738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativePutLong(long windowPtr, long value, int row, int column);
82738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativePutDouble(long windowPtr, double value, int row, int column);
83738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native boolean nativePutNull(long windowPtr, int row, int column);
843bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
85738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static native String nativeGetName(long windowPtr);
86650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown
873bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    /**
880cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * Creates a new empty cursor window and gives it a name.
893bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
903bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The cursor initially has no rows or columns.  Call {@link #setNumColumns(int)} to
913bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * set the number of columns before adding any rows to the cursor.
923bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
940cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * @param name The name of the cursor window, or null if none.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
965e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown    public CursorWindow(String name) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartPos = 0;
985a05c23f3d6a1a895bf5917aacd8bd9a5302ba00Jeff Brown        mName = name != null && name.length() != 0 ? name : "<unnamed>";
991ec4f360605ff62c618ca63368a278cddd0e8a74yingying        if (sCursorWindowSize < 0) {
1001ec4f360605ff62c618ca63368a278cddd0e8a74yingying            /** The cursor window size. resource xml file specifies the value in kB.
1011ec4f360605ff62c618ca63368a278cddd0e8a74yingying             * convert it to bytes here by multiplying with 1024.
1021ec4f360605ff62c618ca63368a278cddd0e8a74yingying             */
1031ec4f360605ff62c618ca63368a278cddd0e8a74yingying            sCursorWindowSize = Resources.getSystem().getInteger(
1041ec4f360605ff62c618ca63368a278cddd0e8a74yingying                com.android.internal.R.integer.config_cursorWindowSize) * 1024;
1051ec4f360605ff62c618ca63368a278cddd0e8a74yingying        }
1065a05c23f3d6a1a895bf5917aacd8bd9a5302ba00Jeff Brown        mWindowPtr = nativeCreate(mName, sCursorWindowSize);
1073bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        if (mWindowPtr == 0) {
1083bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            throw new CursorWindowAllocationException("Cursor window allocation of " +
1093bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown                    (sCursorWindowSize / 1024) + " kb failed. " + printStats());
1103bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        }
111d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown        mCloseGuard.open("close");
1123bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        recordNewWindow(Binder.getCallingPid(), mWindowPtr);
1136141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    }
1146141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori
1150cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown    /**
1160cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * Creates a new empty cursor window.
1170cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * <p>
1180cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * The cursor initially has no rows or columns.  Call {@link #setNumColumns(int)} to
1190cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * set the number of columns before adding any rows to the cursor.
1200cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * </p>
1210cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     *
1220cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     * @param localWindow True if this window will be used in this process only,
1235e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown     * false if it might be sent to another processes.  This argument is ignored.
1245e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown     *
1255e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown     * @deprecated There is no longer a distinction between local and remote
1265e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown     * cursor windows.  Use the {@link #CursorWindow(String)} constructor instead.
1270cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown     */
1285e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown    @Deprecated
1290cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown    public CursorWindow(boolean localWindow) {
1305e5d6d8ba04d7579df840cda055cd5dfa9d7666fJeff Brown        this((String)null);
1310cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown    }
1320cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown
1333bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    private CursorWindow(Parcel source) {
1343bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        mStartPos = source.readInt();
1350cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown        mWindowPtr = nativeCreateFromParcel(source);
1363bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        if (mWindowPtr == 0) {
1373bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            throw new CursorWindowAllocationException("Cursor window could not be "
1383bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown                    + "created from binder.");
1396141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
140650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown        mName = nativeGetName(mWindowPtr);
141d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown        mCloseGuard.open("close");
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1443bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    @Override
1457ce745248d4de0e6543a559c93423df899832100Jeff Brown    protected void finalize() throws Throwable {
1467ce745248d4de0e6543a559c93423df899832100Jeff Brown        try {
147d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown            if (mCloseGuard != null) {
148d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                mCloseGuard.warnIfOpen();
149d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown            }
1507ce745248d4de0e6543a559c93423df899832100Jeff Brown            dispose();
1517ce745248d4de0e6543a559c93423df899832100Jeff Brown        } finally {
1527ce745248d4de0e6543a559c93423df899832100Jeff Brown            super.finalize();
1537ce745248d4de0e6543a559c93423df899832100Jeff Brown        }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1563bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    private void dispose() {
157d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown        if (mCloseGuard != null) {
158d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown            mCloseGuard.close();
159d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown        }
1603bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        if (mWindowPtr != 0) {
1613bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            recordClosingOfWindow(mWindowPtr);
1623bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            nativeDispose(mWindowPtr);
1633bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            mWindowPtr = 0;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1663bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1685a05c23f3d6a1a895bf5917aacd8bd9a5302ba00Jeff Brown     * Gets the name of this cursor window, never null.
169650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown     * @hide
170650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown     */
171650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    public String getName() {
172650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown        return mName;
173650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    }
174650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown
175650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    /**
1763bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Clears out the existing contents of the window, making it safe to reuse
1773bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * for new data.
1783bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
1793bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The start position ({@link #getStartPosition()}), number of rows ({@link #getNumRows()}),
1803bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * and number of columns in the cursor are all reset to zero.
1813bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1833bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public void clear() {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1863bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            mStartPos = 0;
1873bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            nativeClear(mWindowPtr);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1943bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the start position of this cursor window.
1957ce745248d4de0e6543a559c93423df899832100Jeff Brown     * <p>
1967ce745248d4de0e6543a559c93423df899832100Jeff Brown     * The start position is the zero-based index of the first row that this window contains
1973bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * relative to the entire result set of the {@link Cursor}.
1987ce745248d4de0e6543a559c93423df899832100Jeff Brown     * </p>
1993bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
2007ce745248d4de0e6543a559c93423df899832100Jeff Brown     * @return The zero-based start position.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2023bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public int getStartPosition() {
2033bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return mStartPos;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2073bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Sets the start position of this cursor window.
2087ce745248d4de0e6543a559c93423df899832100Jeff Brown     * <p>
2097ce745248d4de0e6543a559c93423df899832100Jeff Brown     * The start position is the zero-based index of the first row that this window contains
2103bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * relative to the entire result set of the {@link Cursor}.
2117ce745248d4de0e6543a559c93423df899832100Jeff Brown     * </p>
2123bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
2137ce745248d4de0e6543a559c93423df899832100Jeff Brown     * @param pos The new zero-based start position.
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2153bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public void setStartPosition(int pos) {
2163bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        mStartPos = pos;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2183bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2203bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the number of rows in this window.
2213bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
2223bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The number of rows in this cursor window.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2243bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public int getNumRows() {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2273bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeGetNumRows(mWindowPtr);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2343bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Sets the number of columns in this window.
2353bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
2363bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * This method must be called before any rows are added to the window, otherwise
2373bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * it will fail to set the number of columns if it differs from the current number
2383bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * of columns.
2393bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
2403bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
2413bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param columnNum The new number of columns.
2423bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2443bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean setNumColumns(int columnNum) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2473bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeSetNumColumns(mWindowPtr, columnNum);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2543bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Allocates a new row at the end of this cursor window.
2553bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
2563bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful, false if the cursor window is out of memory.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2583bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean allocRow(){
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2613bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeAllocRow(mWindowPtr);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2683bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Frees the last row in this cursor window.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2703bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public void freeLastRow(){
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2733bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            nativeFreeLastRow(mWindowPtr);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien    /**
2803bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Returns true if the field at the specified row and column index
2813bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * has type {@link Cursor#FIELD_TYPE_NULL}.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28380e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
2843bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
2853bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if the field has type {@link Cursor#FIELD_TYPE_NULL}.
2863bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @deprecated Use {@link #getType(int, int)} instead.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2883bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    @Deprecated
2893bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean isNull(int row, int column) {
2903bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return getType(row, column) == Cursor.FIELD_TYPE_NULL;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29303d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    /**
2943bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Returns true if the field at the specified row and column index
2953bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * has type {@link Cursor#FIELD_TYPE_BLOB} or {@link Cursor#FIELD_TYPE_NULL}.
2968b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori     *
29780e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
2983bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
2993bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if the field has type {@link Cursor#FIELD_TYPE_BLOB} or
3003bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * {@link Cursor#FIELD_TYPE_NULL}.
3013bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @deprecated Use {@link #getType(int, int)} instead.
3028b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori     */
3038b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori    @Deprecated
3043bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean isBlob(int row, int column) {
3053bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        int type = getType(row, column);
3060a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori        return type == Cursor.FIELD_TYPE_BLOB || type == Cursor.FIELD_TYPE_NULL;
3078b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori    }
3088b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori
3098b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori    /**
3103bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Returns true if the field at the specified row and column index
3113bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * has type {@link Cursor#FIELD_TYPE_INTEGER}.
31203d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana     *
31380e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
3143bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
3153bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if the field has type {@link Cursor#FIELD_TYPE_INTEGER}.
3163bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @deprecated Use {@link #getType(int, int)} instead.
31703d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana     */
3188b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori    @Deprecated
3193bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean isLong(int row, int column) {
3203bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return getType(row, column) == Cursor.FIELD_TYPE_INTEGER;
32103d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    }
32203d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana
32303d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    /**
3243bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Returns true if the field at the specified row and column index
3253bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * has type {@link Cursor#FIELD_TYPE_FLOAT}.
32603d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana     *
32780e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
3283bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
3293bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if the field has type {@link Cursor#FIELD_TYPE_FLOAT}.
3303bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @deprecated Use {@link #getType(int, int)} instead.
33103d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana     */
3328b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori    @Deprecated
3333bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean isFloat(int row, int column) {
3343bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return getType(row, column) == Cursor.FIELD_TYPE_FLOAT;
33503d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    }
33603d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana
33703d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    /**
3383bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Returns true if the field at the specified row and column index
3393bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * has type {@link Cursor#FIELD_TYPE_STRING} or {@link Cursor#FIELD_TYPE_NULL}.
34003d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana     *
34180e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
3423bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
3433bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if the field has type {@link Cursor#FIELD_TYPE_STRING}
3443bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * or {@link Cursor#FIELD_TYPE_NULL}.
3453bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @deprecated Use {@link #getType(int, int)} instead.
34603d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana     */
3478b0dd7da360d70920a37802eb455ba41500d3b45Vasu Nori    @Deprecated
3483bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean isString(int row, int column) {
3493bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        int type = getType(row, column);
3500a2c6cc0138ceac8164061b3cdc3758441916c18Vasu Nori        return type == Cursor.FIELD_TYPE_STRING || type == Cursor.FIELD_TYPE_NULL;
35103d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    }
35203d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana
3533bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    /**
3543bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Returns the type of the field at the specified row and column index.
3553bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
3563bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The returned field types are:
3573bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <ul>
3583bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>{@link Cursor#FIELD_TYPE_NULL}</li>
3593bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>{@link Cursor#FIELD_TYPE_INTEGER}</li>
3603bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>{@link Cursor#FIELD_TYPE_FLOAT}</li>
3613bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>{@link Cursor#FIELD_TYPE_STRING}</li>
3623bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>{@link Cursor#FIELD_TYPE_BLOB}</li>
3633bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </ul>
3643bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
3653bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
36680e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
3673bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
3683bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The field type.
3693bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     */
3703bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public int getType(int row, int column) {
3713bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        acquireReference();
3723bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        try {
3733bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeGetType(mWindowPtr, row - mStartPos, column);
3743bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        } finally {
3753bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            releaseReference();
3763bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        }
3773bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3803bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as a byte array.
3813bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
3823bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined as follows:
3833bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <ul>
3843bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_NULL}, then the result
3853bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is <code>null</code>.</li>
3863bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_BLOB}, then the result
3873bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the blob value.</li>
3883bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_STRING}, then the result
3893bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the array of bytes that make up the internal representation of the
3903bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * string value.</li>
3913bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_INTEGER} or
3923bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * {@link Cursor#FIELD_TYPE_FLOAT}, then a {@link SQLiteException} is thrown.</li>
3933bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </ul>
3943bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
3953bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
39680e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
3973bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
3983bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as a byte array.
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4003bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public byte[] getBlob(int row, int column) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4033bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeGetBlob(mWindowPtr, row - mStartPos, column);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4083bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
409adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien    /**
4103bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as a string.
4113bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
4123bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined as follows:
4133bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <ul>
4143bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_NULL}, then the result
4153bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is <code>null</code>.</li>
4163bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_STRING}, then the result
4173bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the string value.</li>
4183bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_INTEGER}, then the result
4193bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is a string representation of the integer in decimal, obtained by formatting the
4203bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * value with the <code>printf</code> family of functions using
4213bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * format specifier <code>%lld</code>.</li>
4223bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_FLOAT}, then the result
4233bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is a string representation of the floating-point value in decimal, obtained by
4243bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * formatting the value with the <code>printf</code> family of functions using
4253bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * format specifier <code>%g</code>.</li>
4263bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_BLOB}, then a
4273bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * {@link SQLiteException} is thrown.</li>
4283bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </ul>
4293bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
430adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien     *
43180e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
4323bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
4333bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as a string.
434adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien     */
4353bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public String getString(int row, int column) {
4363bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        acquireReference();
4373bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        try {
4383bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeGetString(mWindowPtr, row - mStartPos, column);
4393bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        } finally {
4403bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            releaseReference();
4413bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        }
4423bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4453bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Copies the text of the field at the specified row and column index into
4463bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * a {@link CharArrayBuffer}.
4473bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
4483bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The buffer is populated as follows:
4493bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <ul>
4503bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the buffer is too small for the value to be copied, then it is
4513bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * automatically resized.</li>
4523bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_NULL}, then the buffer
4533bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is set to an empty string.</li>
4543bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_STRING}, then the buffer
4553bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is set to the contents of the string.</li>
4563bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_INTEGER}, then the buffer
4573bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is set to a string representation of the integer in decimal, obtained by formatting the
4583bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * value with the <code>printf</code> family of functions using
4593bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * format specifier <code>%lld</code>.</li>
4603bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_FLOAT}, then the buffer is
4613bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * set to a string representation of the floating-point value in decimal, obtained by
4623bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * formatting the value with the <code>printf</code> family of functions using
4633bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * format specifier <code>%g</code>.</li>
4643bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_BLOB}, then a
4653bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * {@link SQLiteException} is thrown.</li>
4663bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </ul>
4673bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
4683bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
46980e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
4703bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
4713bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param buffer The {@link CharArrayBuffer} to hold the string.  It is automatically
4723bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * resized if the requested string is larger than the buffer's current capacity.
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      */
4743bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public void copyStringToBuffer(int row, int column, CharArrayBuffer buffer) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (buffer == null) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("CharArrayBuffer should not be null");
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4800772007b614d663b65510e5dc4ea264b2fdcb1faJeff Brown            nativeCopyStringToBuffer(mWindowPtr, row - mStartPos, column, buffer);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4853bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4873bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as a <code>long</code>.
4883bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
4893bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined as follows:
4903bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <ul>
4913bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_NULL}, then the result
4923bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is <code>0L</code>.</li>
4933bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_STRING}, then the result
4943bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the value obtained by parsing the string value with <code>strtoll</code>.
4953bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_INTEGER}, then the result
4963bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the <code>long</code> value.</li>
4973bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_FLOAT}, then the result
4983bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the floating-point value converted to a <code>long</code>.</li>
4993bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_BLOB}, then a
5003bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * {@link SQLiteException} is thrown.</li>
5013bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </ul>
5023bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
5033bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
50480e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
5053bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
5063bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as a <code>long</code>.
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5083bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public long getLong(int row, int column) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5113bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeGetLong(mWindowPtr, row - mStartPos, column);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5183bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as a
5193bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <code>double</code>.
5203bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
5213bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined as follows:
5223bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <ul>
5233bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_NULL}, then the result
5243bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is <code>0.0</code>.</li>
5253bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_STRING}, then the result
5263bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the value obtained by parsing the string value with <code>strtod</code>.
5273bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_INTEGER}, then the result
5283bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the integer value converted to a <code>double</code>.</li>
5293bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_FLOAT}, then the result
5303bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * is the <code>double</code> value.</li>
5313bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <li>If the field is of type {@link Cursor#FIELD_TYPE_BLOB}, then a
5323bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * {@link SQLiteException} is thrown.</li>
5333bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </ul>
5343bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
5353bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
53680e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
5373bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
5383bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as a <code>double</code>.
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5403bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public double getDouble(int row, int column) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5433bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativeGetDouble(mWindowPtr, row - mStartPos, column);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5483bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
5493bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    /**
5503bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as a
5513bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <code>short</code>.
5523bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
5533bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined by invoking {@link #getLong} and converting the
5543bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * result to <code>short</code>.
5553bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
5563bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
55780e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
5583bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
5593bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as a <code>short</code>.
5603bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     */
5613bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public short getShort(int row, int column) {
5623bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return (short) getLong(row, column);
5633bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    }
5643bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
5653bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    /**
5663bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as an
5673bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <code>int</code>.
5683bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
5693bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined by invoking {@link #getLong} and converting the
5703bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * result to <code>int</code>.
5713bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
5723bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
57380e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
5743bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
5753bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as an <code>int</code>.
5763bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     */
5773bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public int getInt(int row, int column) {
5783bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return (int) getLong(row, column);
5793bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    }
5803bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
581adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien    /**
5823bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Gets the value of the field at the specified row and column index as a
5833bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <code>float</code>.
5843bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * <p>
5853bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * The result is determined by invoking {@link #getDouble} and converting the
5863bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * result to <code>float</code>.
5873bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * </p>
588adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien     *
58980e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
5903bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
5913bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return The value of the field as an <code>float</code>.
592adf41944584f67378481e84cb7661f0a39028bd8Daniel Trebbien     */
5933bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public float getFloat(int row, int column) {
5943bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        return (float) getDouble(row, column);
5953bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5983bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Copies a byte array into the field at the specified row and column index.
5993bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
6003bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param value The value to store.
60180e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
6023bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
6033bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful.
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6053bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean putBlob(byte[] value, int row, int column) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6083bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativePutBlob(mWindowPtr, value, row - mStartPos, column);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6153bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Copies a string into the field at the specified row and column index.
6163bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
6173bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param value The value to store.
61880e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
6193bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
6203bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful.
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6223bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean putString(String value, int row, int column) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6253bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativePutString(mWindowPtr, value, row - mStartPos, column);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6303bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6323bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Puts a long integer into the field at the specified row and column index.
6333bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
6343bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param value The value to store.
63580e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
6363bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
6373bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful.
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6393bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean putLong(long value, int row, int column) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6423bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativePutLong(mWindowPtr, value, row - mStartPos, column);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6463bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    }
6473bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6493bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Puts a double-precision floating point value into the field at the
6503bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * specified row and column index.
6513bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
6523bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param value The value to store.
65380e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
6543bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
6553bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful.
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6573bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean putDouble(double value, int row, int column) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6603bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativePutDouble(mWindowPtr, value, row - mStartPos, column);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6673bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * Puts a null value into the field at the specified row and column index.
6683bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     *
66980e7b80fa607e13d31d7dab68ddfd4d9f0372e38Jeff Brown     * @param row The zero-based row index.
6703bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @param column The zero-based column index.
6713bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown     * @return True if successful.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6733bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown    public boolean putNull(int row, int column) {
6743bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        acquireReference();
6753bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        try {
6763bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            return nativePutNull(mWindowPtr, row - mStartPos, column);
6773bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        } finally {
6783bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown            releaseReference();
6790e453d1115d03b80c2779dfc600cf3a829b96435Vasu Nori        }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6813bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<CursorWindow> CREATOR
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<CursorWindow>() {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CursorWindow createFromParcel(Parcel source) {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new CursorWindow(source);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CursorWindow[] newArray(int size) {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new CursorWindow[size];
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static CursorWindow newFromParcel(Parcel p) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return CREATOR.createFromParcel(p);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
70203bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown        acquireReference();
70303bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown        try {
70403bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown            dest.writeInt(mStartPos);
70503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown            nativeWriteToParcel(mWindowPtr, dest);
70603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown        } finally {
70703bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown            releaseReference();
70803bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown        }
709d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown
710d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown        if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) {
711d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown            releaseReference();
712d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown        }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onAllReferencesReleased() {
7173bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown        dispose();
7186141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    }
7196141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori
720738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private static final LongSparseArray<Integer> sWindowToPidMap = new LongSparseArray<Integer>();
7216141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori
722738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private void recordNewWindow(int pid, long window) {
7236141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        synchronized (sWindowToPidMap) {
7246141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            sWindowToPidMap.put(window, pid);
7256141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            if (Log.isLoggable(STATS_TAG, Log.VERBOSE)) {
7266141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                Log.i(STATS_TAG, "Created a new Cursor. " + printStats());
7276141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            }
7286141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
7296141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    }
7306141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori
731738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat    private void recordClosingOfWindow(long window) {
7326141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        synchronized (sWindowToPidMap) {
7336141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            if (sWindowToPidMap.size() == 0) {
7346141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                // this means we are not in the ContentProvider.
7356141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                return;
7366141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            }
7376141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            sWindowToPidMap.delete(window);
7386141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
7396141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    }
7403bc6bbc92cd2095f42039b5aadd0a14d0e5d9230Jeff Brown
7416141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori    private String printStats() {
7426141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        StringBuilder buff = new StringBuilder();
7436141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        int myPid = Process.myPid();
7446141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        int total = 0;
7456141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        SparseIntArray pidCounts = new SparseIntArray();
7466141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        synchronized (sWindowToPidMap) {
7476141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            int size = sWindowToPidMap.size();
7486141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            if (size == 0) {
7496141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                // this means we are not in the ContentProvider.
7506141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                return "";
7516141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            }
7526141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            for (int indx = 0; indx < size; indx++) {
7536141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                int pid = sWindowToPidMap.valueAt(indx);
7546141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                int value = pidCounts.get(pid);
7556141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                pidCounts.put(pid, ++value);
7566141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            }
7576141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
7586141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        int numPids = pidCounts.size();
7596141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        for (int i = 0; i < numPids;i++) {
7606141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            buff.append(" (# cursors opened by ");
7616141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            int pid = pidCounts.keyAt(i);
7626141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            if (pid == myPid) {
7636141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                buff.append("this proc=");
7646141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            } else {
7656141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori                buff.append("pid " + pid + "=");
7666141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            }
7676141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            int num = pidCounts.get(pid);
7686141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            buff.append(num + ")");
7696141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori            total += num;
7706141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        }
7716141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        // limit the returned string size to 1000
7726141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        String s = (buff.length() > 980) ? buff.substring(0, 980) : buff.toString();
7736141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori        return "# Open Cursors=" + total + s;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
775650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown
776650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    @Override
777650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    public String toString() {
778738702d28ab7e0e89e3c6e18fd46cc1361917eb9Ashok Bhat        return getName() + " {" + Long.toHexString(mWindowPtr) + "}";
779650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
781