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 19a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringertimport android.os.ParcelFileDescriptor; 20cfda9f3a4756c71b3aadd1387419cb3b513dd400Brad Fitzpatrick 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 22e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * Represents a statement that can be executed against a database. The statement 23e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * cannot return multiple rows or columns, but single value (1 x 1) result sets 24e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * are supported. 25e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * <p> 26e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * This class is not thread-safe. 27e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown * </p> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brownpublic final class SQLiteStatement extends SQLiteProgram { 30e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown SQLiteStatement(SQLiteDatabase db, String sql, Object[] bindArgs) { 3175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown super(db, sql, bindArgs, null); 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * Execute this SQL statement, if it is not a SELECT / INSERT / DELETE / UPDATE, for example 36fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * CREATE / DROP table, view, trigger, index etc. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws android.database.SQLException If the SQL string is invalid for 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some reason 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void execute() { 42e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 43e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown try { 4475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown getSession().execute(getSql(), getBindArgs(), getConnectionFlags(), null); 45e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 46e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 47e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 48e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } finally { 49e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown releaseReference(); 50e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } 51fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori } 52fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori 53fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori /** 544e874edf69ce9900eb847629dc4d3616972a3468Vasu Nori * Execute this SQL statement, if the the number of rows affected by execution of this SQL 55fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * statement is of any importance to the caller - for example, UPDATE / DELETE SQL statements. 56fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * 57fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * @return the number of rows affected by this SQL statement execution. 58fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * @throws android.database.SQLException If the SQL string is invalid for 59fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori * some reason 60fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori */ 61fb16cbd9b2e86d6878d4bff820422bc09c8938deVasu Nori public int executeUpdateDelete() { 62e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 632467561ac2c7de870417e0405a138c857c9d5629Vasu Nori try { 64e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return getSession().executeForChangedRowCount( 6575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown getSql(), getBindArgs(), getConnectionFlags(), null); 66e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 67e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 68e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 692467561ac2c7de870417e0405a138c857c9d5629Vasu Nori } finally { 70e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown releaseReference(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 755bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori * Execute this SQL statement and return the ID of the row inserted due to this call. 765bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori * The SQL statement should be an INSERT for this to be a useful call. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 785bf67247d2e299f0586de65b2d024f1f835657e0Vasu Nori * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws android.database.SQLException If the SQL string is invalid for 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some reason 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long executeInsert() { 84e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 852467561ac2c7de870417e0405a138c857c9d5629Vasu Nori try { 86e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return getSession().executeForLastInsertedRowId( 8775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown getSql(), getBindArgs(), getConnectionFlags(), null); 88e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 89e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 90e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 912467561ac2c7de870417e0405a138c857c9d5629Vasu Nori } finally { 92e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown releaseReference(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute a statement that returns a 1 by 1 table with a numeric value. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, SELECT COUNT(*) FROM table; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The result of the query. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long simpleQueryForLong() { 105e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 1062467561ac2c7de870417e0405a138c857c9d5629Vasu Nori try { 107e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return getSession().executeForLong( 10875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown getSql(), getBindArgs(), getConnectionFlags(), null); 109e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 110e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 111e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 1122467561ac2c7de870417e0405a138c857c9d5629Vasu Nori } finally { 113e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown releaseReference(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute a statement that returns a 1 by 1 table with a text value. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, SELECT COUNT(*) FROM table; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The result of the query. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String simpleQueryForString() { 126e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 1272467561ac2c7de870417e0405a138c857c9d5629Vasu Nori try { 128e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return getSession().executeForString( 12975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown getSql(), getBindArgs(), getConnectionFlags(), null); 130e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 131e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 132e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 1332467561ac2c7de870417e0405a138c857c9d5629Vasu Nori } finally { 134e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown releaseReference(); 1357501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori } 1367501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori } 1377501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori 1387501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori /** 139a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert * Executes a statement that returns a 1 by 1 table with a blob value. 140a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert * 141a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert * @return A read-only file descriptor for a copy of the blob value, or {@code null} 142a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert * if the value is null or could not be read for some reason. 143a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert * 144a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows 145a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert */ 146a006b47298539d89dc7a06b54c070cb3e986352aBjorn Bringert public ParcelFileDescriptor simpleQueryForBlobFileDescriptor() { 147e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown acquireReference(); 1482467561ac2c7de870417e0405a138c857c9d5629Vasu Nori try { 149e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return getSession().executeForBlobFileDescriptor( 15075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown getSql(), getBindArgs(), getConnectionFlags(), null); 151e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown } catch (SQLiteDatabaseCorruptException ex) { 152e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown onCorruption(); 153e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown throw ex; 1542467561ac2c7de870417e0405a138c857c9d5629Vasu Nori } finally { 155e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown releaseReference(); 156ce38b98feb1e7c9c1799eb270c40798d833aa9aeVasu Nori } 1577501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori } 1587501010b71d57264a06f82937f5fb29cb9f4b509Vasu Nori 159e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown @Override 160e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown public String toString() { 161e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown return "SQLiteProgram: " + getSql(); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 164