SQLiteStatement.java revision 5bf67247d2e299f0586de65b2d024f1f835657e0
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.sqlite;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196a353876178ca2fe4bc61f128130067d2c2574d1Brad Fitzpatrickimport android.os.SystemClock;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A pre-compiled statement against a {@link SQLiteDatabase} that can be reused.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statement cannot return multiple rows, but 1x1 result sets are allowed.
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Don't use SQLiteStatement constructor directly, please use
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SQLiteDatabase#compileStatement(String)}
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SQLiteStatement extends SQLiteProgram
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Don't use SQLiteStatement constructor directly, please use
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SQLiteDatabase#compileStatement(String)}
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param db
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sql
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ SQLiteStatement(SQLiteDatabase db, String sql) {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(db, sql);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute this SQL statement, if it is not a query. For example,
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * CREATE TABLE, DELTE, INSERT, etc.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.SQLException If the SQL string is invalid for
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         some reason
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void execute() {
476a353876178ca2fe4bc61f128130067d2c2574d1Brad Fitzpatrick        long timeStart = SystemClock.uptimeMillis();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.lock();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            native_execute();
5312311959c6ec6898e3b40d4e8958b29ec0b72da9Dan Egnor            mDatabase.logTimeStat(mSql, timeStart);
545a03f36ef845f73eb4473193dbb0f93dd12a51afVasu Nori        } finally {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.unlock();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
615bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori     * Execute this SQL statement and return the ID of the row inserted due to this call.
625bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori     * The SQL statement should be an INSERT for this to be a useful call.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
645bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori     * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.SQLException If the SQL string is invalid for
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         some reason
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long executeInsert() {
706a353876178ca2fe4bc61f128130067d2c2574d1Brad Fitzpatrick        long timeStart = SystemClock.uptimeMillis();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.lock();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            native_execute();
7612311959c6ec6898e3b40d4e8958b29ec0b72da9Dan Egnor            mDatabase.logTimeStat(mSql, timeStart);
775bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori            return (mDatabase.lastChangeCount() > 0) ? mDatabase.lastInsertRow() : -1;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.unlock();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a statement that returns a 1 by 1 table with a numeric value.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, SELECT COUNT(*) FROM table;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The result of the query.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long simpleQueryForLong() {
936a353876178ca2fe4bc61f128130067d2c2574d1Brad Fitzpatrick        long timeStart = SystemClock.uptimeMillis();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.lock();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long retValue = native_1x1_long();
9912311959c6ec6898e3b40d4e8958b29ec0b72da9Dan Egnor            mDatabase.logTimeStat(mSql, timeStart);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return retValue;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.unlock();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a statement that returns a 1 by 1 table with a text value.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, SELECT COUNT(*) FROM table;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The result of the query.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String simpleQueryForString() {
1166a353876178ca2fe4bc61f128130067d2c2574d1Brad Fitzpatrick        long timeStart = SystemClock.uptimeMillis();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.lock();
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        acquireReference();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String retValue = native_1x1_string();
12212311959c6ec6898e3b40d4e8958b29ec0b72da9Dan Egnor            mDatabase.logTimeStat(mSql, timeStart);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return retValue;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            releaseReference();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.unlock();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final native void native_execute();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final native long native_1x1_long();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final native String native_1x1_string();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
134