1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.database.sqlite; 18 19 import android.content.ContentValues; 20 import android.database.Cursor; 21 import android.database.DatabaseErrorHandler; 22 import android.database.DatabaseUtils; 23 import android.database.DefaultDatabaseErrorHandler; 24 import android.database.SQLException; 25 import android.database.sqlite.SQLiteDebug.DbStats; 26 import android.os.CancellationSignal; 27 import android.os.Looper; 28 import android.os.OperationCanceledException; 29 import android.text.TextUtils; 30 import android.util.EventLog; 31 import android.util.Log; 32 import android.util.Pair; 33 import android.util.Printer; 34 35 import dalvik.system.CloseGuard; 36 37 import java.io.File; 38 import java.io.FileFilter; 39 import java.util.ArrayList; 40 import java.util.HashMap; 41 import java.util.List; 42 import java.util.Locale; 43 import java.util.Map; 44 import java.util.WeakHashMap; 45 46 /** 47 * Exposes methods to manage a SQLite database. 48 * 49 * <p> 50 * SQLiteDatabase has methods to create, delete, execute SQL commands, and 51 * perform other common database management tasks. 52 * </p><p> 53 * See the Notepad sample application in the SDK for an example of creating 54 * and managing a database. 55 * </p><p> 56 * Database names must be unique within an application, not across all applications. 57 * </p> 58 * 59 * <h3>Localized Collation - ORDER BY</h3> 60 * <p> 61 * In addition to SQLite's default <code>BINARY</code> collator, Android supplies 62 * two more, <code>LOCALIZED</code>, which changes with the system's current locale, 63 * and <code>UNICODE</code>, which is the Unicode Collation Algorithm and not tailored 64 * to the current locale. 65 * </p> 66 */ 67 public final class SQLiteDatabase extends SQLiteClosable { 68 private static final String TAG = "SQLiteDatabase"; 69 70 private static final int EVENT_DB_CORRUPT = 75004; 71 72 // Stores reference to all databases opened in the current process. 73 // (The referent Object is not used at this time.) 74 // INVARIANT: Guarded by sActiveDatabases. 75 private static WeakHashMap<SQLiteDatabase, Object> sActiveDatabases = 76 new WeakHashMap<SQLiteDatabase, Object>(); 77 78 // Thread-local for database sessions that belong to this database. 79 // Each thread has its own database session. 80 // INVARIANT: Immutable. 81 private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLiteSession>() { 82 @Override 83 protected SQLiteSession initialValue() { 84 return createSession(); 85 } 86 }; 87 88 // The optional factory to use when creating new Cursors. May be null. 89 // INVARIANT: Immutable. 90 private final CursorFactory mCursorFactory; 91 92 // Error handler to be used when SQLite returns corruption errors. 93 // INVARIANT: Immutable. 94 private final DatabaseErrorHandler mErrorHandler; 95 96 // Shared database state lock. 97 // This lock guards all of the shared state of the database, such as its 98 // configuration, whether it is open or closed, and so on. This lock should 99 // be held for as little time as possible. 100 // 101 // The lock MUST NOT be held while attempting to acquire database connections or 102 // while executing SQL statements on behalf of the client as it can lead to deadlock. 103 // 104 // It is ok to hold the lock while reconfiguring the connection pool or dumping 105 // statistics because those operations are non-reentrant and do not try to acquire 106 // connections that might be held by other threads. 107 // 108 // Basic rule: grab the lock, access or modify global state, release the lock, then 109 // do the required SQL work. 110 private final Object mLock = new Object(); 111 112 // Warns if the database is finalized without being closed properly. 113 // INVARIANT: Guarded by mLock. 114 private final CloseGuard mCloseGuardLocked = CloseGuard.get(); 115 116 // The database configuration. 117 // INVARIANT: Guarded by mLock. 118 private final SQLiteDatabaseConfiguration mConfigurationLocked; 119 120 // The connection pool for the database, null when closed. 121 // The pool itself is thread-safe, but the reference to it can only be acquired 122 // when the lock is held. 123 // INVARIANT: Guarded by mLock. 124 private SQLiteConnectionPool mConnectionPoolLocked; 125 126 // True if the database has attached databases. 127 // INVARIANT: Guarded by mLock. 128 private boolean mHasAttachedDbsLocked; 129 130 /** 131 * When a constraint violation occurs, an immediate ROLLBACK occurs, 132 * thus ending the current transaction, and the command aborts with a 133 * return code of SQLITE_CONSTRAINT. If no transaction is active 134 * (other than the implied transaction that is created on every command) 135 * then this algorithm works the same as ABORT. 136 */ 137 public static final int CONFLICT_ROLLBACK = 1; 138 139 /** 140 * When a constraint violation occurs,no ROLLBACK is executed 141 * so changes from prior commands within the same transaction 142 * are preserved. This is the default behavior. 143 */ 144 public static final int CONFLICT_ABORT = 2; 145 146 /** 147 * When a constraint violation occurs, the command aborts with a return 148 * code SQLITE_CONSTRAINT. But any changes to the database that 149 * the command made prior to encountering the constraint violation 150 * are preserved and are not backed out. 151 */ 152 public static final int CONFLICT_FAIL = 3; 153 154 /** 155 * When a constraint violation occurs, the one row that contains 156 * the constraint violation is not inserted or changed. 157 * But the command continues executing normally. Other rows before and 158 * after the row that contained the constraint violation continue to be 159 * inserted or updated normally. No error is returned. 160 */ 161 public static final int CONFLICT_IGNORE = 4; 162 163 /** 164 * When a UNIQUE constraint violation occurs, the pre-existing rows that 165 * are causing the constraint violation are removed prior to inserting 166 * or updating the current row. Thus the insert or update always occurs. 167 * The command continues executing normally. No error is returned. 168 * If a NOT NULL constraint violation occurs, the NULL value is replaced 169 * by the default value for that column. If the column has no default 170 * value, then the ABORT algorithm is used. If a CHECK constraint 171 * violation occurs then the IGNORE algorithm is used. When this conflict 172 * resolution strategy deletes rows in order to satisfy a constraint, 173 * it does not invoke delete triggers on those rows. 174 * This behavior might change in a future release. 175 */ 176 public static final int CONFLICT_REPLACE = 5; 177 178 /** 179 * Use the following when no conflict action is specified. 180 */ 181 public static final int CONFLICT_NONE = 0; 182 183 private static final String[] CONFLICT_VALUES = new String[] 184 {"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "}; 185 186 /** 187 * Maximum Length Of A LIKE Or GLOB Pattern 188 * The pattern matching algorithm used in the default LIKE and GLOB implementation 189 * of SQLite can exhibit O(N^2) performance (where N is the number of characters in 190 * the pattern) for certain pathological cases. To avoid denial-of-service attacks 191 * the length of the LIKE or GLOB pattern is limited to SQLITE_MAX_LIKE_PATTERN_LENGTH bytes. 192 * The default value of this limit is 50000. A modern workstation can evaluate 193 * even a pathological LIKE or GLOB pattern of 50000 bytes relatively quickly. 194 * The denial of service problem only comes into play when the pattern length gets 195 * into millions of bytes. Nevertheless, since most useful LIKE or GLOB patterns 196 * are at most a few dozen bytes in length, paranoid application developers may 197 * want to reduce this parameter to something in the range of a few hundred 198 * if they know that external users are able to generate arbitrary patterns. 199 */ 200 public static final int SQLITE_MAX_LIKE_PATTERN_LENGTH = 50000; 201 202 /** 203 * Open flag: Flag for {@link #openDatabase} to open the database for reading and writing. 204 * If the disk is full, this may fail even before you actually write anything. 205 * 206 * {@more} Note that the value of this flag is 0, so it is the default. 207 */ 208 public static final int OPEN_READWRITE = 0x00000000; // update native code if changing 209 210 /** 211 * Open flag: Flag for {@link #openDatabase} to open the database for reading only. 212 * This is the only reliable way to open a database if the disk may be full. 213 */ 214 public static final int OPEN_READONLY = 0x00000001; // update native code if changing 215 216 private static final int OPEN_READ_MASK = 0x00000001; // update native code if changing 217 218 /** 219 * Open flag: Flag for {@link #openDatabase} to open the database without support for 220 * localized collators. 221 * 222 * {@more} This causes the collator <code>LOCALIZED</code> not to be created. 223 * You must be consistent when using this flag to use the setting the database was 224 * created with. If this is set, {@link #setLocale} will do nothing. 225 */ 226 public static final int NO_LOCALIZED_COLLATORS = 0x00000010; // update native code if changing 227 228 /** 229 * Open flag: Flag for {@link #openDatabase} to create the database file if it does not 230 * already exist. 231 */ 232 public static final int CREATE_IF_NECESSARY = 0x10000000; // update native code if changing 233 234 /** 235 * Open flag: Flag for {@link #openDatabase} to open the database file with 236 * write-ahead logging enabled by default. Using this flag is more efficient 237 * than calling {@link #enableWriteAheadLogging}. 238 * 239 * Write-ahead logging cannot be used with read-only databases so the value of 240 * this flag is ignored if the database is opened read-only. 241 * 242 * @see #enableWriteAheadLogging 243 */ 244 public static final int ENABLE_WRITE_AHEAD_LOGGING = 0x20000000; 245 246 /** 247 * Absolute max value that can be set by {@link #setMaxSqlCacheSize(int)}. 248 * 249 * Each prepared-statement is between 1K - 6K, depending on the complexity of the 250 * SQL statement & schema. A large SQL cache may use a significant amount of memory. 251 */ 252 public static final int MAX_SQL_CACHE_SIZE = 100; 253 SQLiteDatabase(String path, int openFlags, CursorFactory cursorFactory, DatabaseErrorHandler errorHandler)254 private SQLiteDatabase(String path, int openFlags, CursorFactory cursorFactory, 255 DatabaseErrorHandler errorHandler) { 256 mCursorFactory = cursorFactory; 257 mErrorHandler = errorHandler != null ? errorHandler : new DefaultDatabaseErrorHandler(); 258 mConfigurationLocked = new SQLiteDatabaseConfiguration(path, openFlags); 259 } 260 261 @Override finalize()262 protected void finalize() throws Throwable { 263 try { 264 dispose(true); 265 } finally { 266 super.finalize(); 267 } 268 } 269 270 @Override onAllReferencesReleased()271 protected void onAllReferencesReleased() { 272 dispose(false); 273 } 274 dispose(boolean finalized)275 private void dispose(boolean finalized) { 276 final SQLiteConnectionPool pool; 277 synchronized (mLock) { 278 if (mCloseGuardLocked != null) { 279 if (finalized) { 280 mCloseGuardLocked.warnIfOpen(); 281 } 282 mCloseGuardLocked.close(); 283 } 284 285 pool = mConnectionPoolLocked; 286 mConnectionPoolLocked = null; 287 } 288 289 if (!finalized) { 290 synchronized (sActiveDatabases) { 291 sActiveDatabases.remove(this); 292 } 293 294 if (pool != null) { 295 pool.close(); 296 } 297 } 298 } 299 300 /** 301 * Attempts to release memory that SQLite holds but does not require to 302 * operate properly. Typically this memory will come from the page cache. 303 * 304 * @return the number of bytes actually released 305 */ releaseMemory()306 public static int releaseMemory() { 307 return SQLiteGlobal.releaseMemory(); 308 } 309 310 /** 311 * Control whether or not the SQLiteDatabase is made thread-safe by using locks 312 * around critical sections. This is pretty expensive, so if you know that your 313 * DB will only be used by a single thread then you should set this to false. 314 * The default is true. 315 * @param lockingEnabled set to true to enable locks, false otherwise 316 * 317 * @deprecated This method now does nothing. Do not use. 318 */ 319 @Deprecated setLockingEnabled(boolean lockingEnabled)320 public void setLockingEnabled(boolean lockingEnabled) { 321 } 322 323 /** 324 * Gets a label to use when describing the database in log messages. 325 * @return The label. 326 */ getLabel()327 String getLabel() { 328 synchronized (mLock) { 329 return mConfigurationLocked.label; 330 } 331 } 332 333 /** 334 * Sends a corruption message to the database error handler. 335 */ onCorruption()336 void onCorruption() { 337 EventLog.writeEvent(EVENT_DB_CORRUPT, getLabel()); 338 mErrorHandler.onCorruption(this); 339 } 340 341 /** 342 * Gets the {@link SQLiteSession} that belongs to this thread for this database. 343 * Once a thread has obtained a session, it will continue to obtain the same 344 * session even after the database has been closed (although the session will not 345 * be usable). However, a thread that does not already have a session cannot 346 * obtain one after the database has been closed. 347 * 348 * The idea is that threads that have active connections to the database may still 349 * have work to complete even after the call to {@link #close}. Active database 350 * connections are not actually disposed until they are released by the threads 351 * that own them. 352 * 353 * @return The session, never null. 354 * 355 * @throws IllegalStateException if the thread does not yet have a session and 356 * the database is not open. 357 */ getThreadSession()358 SQLiteSession getThreadSession() { 359 return mThreadSession.get(); // initialValue() throws if database closed 360 } 361 createSession()362 SQLiteSession createSession() { 363 final SQLiteConnectionPool pool; 364 synchronized (mLock) { 365 throwIfNotOpenLocked(); 366 pool = mConnectionPoolLocked; 367 } 368 return new SQLiteSession(pool); 369 } 370 371 /** 372 * Gets default connection flags that are appropriate for this thread, taking into 373 * account whether the thread is acting on behalf of the UI. 374 * 375 * @param readOnly True if the connection should be read-only. 376 * @return The connection flags. 377 */ getThreadDefaultConnectionFlags(boolean readOnly)378 int getThreadDefaultConnectionFlags(boolean readOnly) { 379 int flags = readOnly ? SQLiteConnectionPool.CONNECTION_FLAG_READ_ONLY : 380 SQLiteConnectionPool.CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY; 381 if (isMainThread()) { 382 flags |= SQLiteConnectionPool.CONNECTION_FLAG_INTERACTIVE; 383 } 384 return flags; 385 } 386 isMainThread()387 private static boolean isMainThread() { 388 // FIXME: There should be a better way to do this. 389 // Would also be nice to have something that would work across Binder calls. 390 Looper looper = Looper.myLooper(); 391 return looper != null && looper == Looper.getMainLooper(); 392 } 393 394 /** 395 * Begins a transaction in EXCLUSIVE mode. 396 * <p> 397 * Transactions can be nested. 398 * When the outer transaction is ended all of 399 * the work done in that transaction and all of the nested transactions will be committed or 400 * rolled back. The changes will be rolled back if any transaction is ended without being 401 * marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed. 402 * </p> 403 * <p>Here is the standard idiom for transactions: 404 * 405 * <pre> 406 * db.beginTransaction(); 407 * try { 408 * ... 409 * db.setTransactionSuccessful(); 410 * } finally { 411 * db.endTransaction(); 412 * } 413 * </pre> 414 */ beginTransaction()415 public void beginTransaction() { 416 beginTransaction(null /* transactionStatusCallback */, true); 417 } 418 419 /** 420 * Begins a transaction in IMMEDIATE mode. Transactions can be nested. When 421 * the outer transaction is ended all of the work done in that transaction 422 * and all of the nested transactions will be committed or rolled back. The 423 * changes will be rolled back if any transaction is ended without being 424 * marked as clean (by calling setTransactionSuccessful). Otherwise they 425 * will be committed. 426 * <p> 427 * Here is the standard idiom for transactions: 428 * 429 * <pre> 430 * db.beginTransactionNonExclusive(); 431 * try { 432 * ... 433 * db.setTransactionSuccessful(); 434 * } finally { 435 * db.endTransaction(); 436 * } 437 * </pre> 438 */ beginTransactionNonExclusive()439 public void beginTransactionNonExclusive() { 440 beginTransaction(null /* transactionStatusCallback */, false); 441 } 442 443 /** 444 * Begins a transaction in EXCLUSIVE mode. 445 * <p> 446 * Transactions can be nested. 447 * When the outer transaction is ended all of 448 * the work done in that transaction and all of the nested transactions will be committed or 449 * rolled back. The changes will be rolled back if any transaction is ended without being 450 * marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed. 451 * </p> 452 * <p>Here is the standard idiom for transactions: 453 * 454 * <pre> 455 * db.beginTransactionWithListener(listener); 456 * try { 457 * ... 458 * db.setTransactionSuccessful(); 459 * } finally { 460 * db.endTransaction(); 461 * } 462 * </pre> 463 * 464 * @param transactionListener listener that should be notified when the transaction begins, 465 * commits, or is rolled back, either explicitly or by a call to 466 * {@link #yieldIfContendedSafely}. 467 */ beginTransactionWithListener(SQLiteTransactionListener transactionListener)468 public void beginTransactionWithListener(SQLiteTransactionListener transactionListener) { 469 beginTransaction(transactionListener, true); 470 } 471 472 /** 473 * Begins a transaction in IMMEDIATE mode. Transactions can be nested. When 474 * the outer transaction is ended all of the work done in that transaction 475 * and all of the nested transactions will be committed or rolled back. The 476 * changes will be rolled back if any transaction is ended without being 477 * marked as clean (by calling setTransactionSuccessful). Otherwise they 478 * will be committed. 479 * <p> 480 * Here is the standard idiom for transactions: 481 * 482 * <pre> 483 * db.beginTransactionWithListenerNonExclusive(listener); 484 * try { 485 * ... 486 * db.setTransactionSuccessful(); 487 * } finally { 488 * db.endTransaction(); 489 * } 490 * </pre> 491 * 492 * @param transactionListener listener that should be notified when the 493 * transaction begins, commits, or is rolled back, either 494 * explicitly or by a call to {@link #yieldIfContendedSafely}. 495 */ beginTransactionWithListenerNonExclusive( SQLiteTransactionListener transactionListener)496 public void beginTransactionWithListenerNonExclusive( 497 SQLiteTransactionListener transactionListener) { 498 beginTransaction(transactionListener, false); 499 } 500 beginTransaction(SQLiteTransactionListener transactionListener, boolean exclusive)501 private void beginTransaction(SQLiteTransactionListener transactionListener, 502 boolean exclusive) { 503 acquireReference(); 504 try { 505 getThreadSession().beginTransaction( 506 exclusive ? SQLiteSession.TRANSACTION_MODE_EXCLUSIVE : 507 SQLiteSession.TRANSACTION_MODE_IMMEDIATE, 508 transactionListener, 509 getThreadDefaultConnectionFlags(false /*readOnly*/), null); 510 } finally { 511 releaseReference(); 512 } 513 } 514 515 /** 516 * End a transaction. See beginTransaction for notes about how to use this and when transactions 517 * are committed and rolled back. 518 */ endTransaction()519 public void endTransaction() { 520 acquireReference(); 521 try { 522 getThreadSession().endTransaction(null); 523 } finally { 524 releaseReference(); 525 } 526 } 527 528 /** 529 * Marks the current transaction as successful. Do not do any more database work between 530 * calling this and calling endTransaction. Do as little non-database work as possible in that 531 * situation too. If any errors are encountered between this and endTransaction the transaction 532 * will still be committed. 533 * 534 * @throws IllegalStateException if the current thread is not in a transaction or the 535 * transaction is already marked as successful. 536 */ setTransactionSuccessful()537 public void setTransactionSuccessful() { 538 acquireReference(); 539 try { 540 getThreadSession().setTransactionSuccessful(); 541 } finally { 542 releaseReference(); 543 } 544 } 545 546 /** 547 * Returns true if the current thread has a transaction pending. 548 * 549 * @return True if the current thread is in a transaction. 550 */ inTransaction()551 public boolean inTransaction() { 552 acquireReference(); 553 try { 554 return getThreadSession().hasTransaction(); 555 } finally { 556 releaseReference(); 557 } 558 } 559 560 /** 561 * Returns true if the current thread is holding an active connection to the database. 562 * <p> 563 * The name of this method comes from a time when having an active connection 564 * to the database meant that the thread was holding an actual lock on the 565 * database. Nowadays, there is no longer a true "database lock" although threads 566 * may block if they cannot acquire a database connection to perform a 567 * particular operation. 568 * </p> 569 * 570 * @return True if the current thread is holding an active connection to the database. 571 */ isDbLockedByCurrentThread()572 public boolean isDbLockedByCurrentThread() { 573 acquireReference(); 574 try { 575 return getThreadSession().hasConnection(); 576 } finally { 577 releaseReference(); 578 } 579 } 580 581 /** 582 * Always returns false. 583 * <p> 584 * There is no longer the concept of a database lock, so this method always returns false. 585 * </p> 586 * 587 * @return False. 588 * @deprecated Always returns false. Do not use this method. 589 */ 590 @Deprecated isDbLockedByOtherThreads()591 public boolean isDbLockedByOtherThreads() { 592 return false; 593 } 594 595 /** 596 * Temporarily end the transaction to let other threads run. The transaction is assumed to be 597 * successful so far. Do not call setTransactionSuccessful before calling this. When this 598 * returns a new transaction will have been created but not marked as successful. 599 * @return true if the transaction was yielded 600 * @deprecated if the db is locked more than once (becuase of nested transactions) then the lock 601 * will not be yielded. Use yieldIfContendedSafely instead. 602 */ 603 @Deprecated yieldIfContended()604 public boolean yieldIfContended() { 605 return yieldIfContendedHelper(false /* do not check yielding */, 606 -1 /* sleepAfterYieldDelay */); 607 } 608 609 /** 610 * Temporarily end the transaction to let other threads run. The transaction is assumed to be 611 * successful so far. Do not call setTransactionSuccessful before calling this. When this 612 * returns a new transaction will have been created but not marked as successful. This assumes 613 * that there are no nested transactions (beginTransaction has only been called once) and will 614 * throw an exception if that is not the case. 615 * @return true if the transaction was yielded 616 */ yieldIfContendedSafely()617 public boolean yieldIfContendedSafely() { 618 return yieldIfContendedHelper(true /* check yielding */, -1 /* sleepAfterYieldDelay*/); 619 } 620 621 /** 622 * Temporarily end the transaction to let other threads run. The transaction is assumed to be 623 * successful so far. Do not call setTransactionSuccessful before calling this. When this 624 * returns a new transaction will have been created but not marked as successful. This assumes 625 * that there are no nested transactions (beginTransaction has only been called once) and will 626 * throw an exception if that is not the case. 627 * @param sleepAfterYieldDelay if > 0, sleep this long before starting a new transaction if 628 * the lock was actually yielded. This will allow other background threads to make some 629 * more progress than they would if we started the transaction immediately. 630 * @return true if the transaction was yielded 631 */ yieldIfContendedSafely(long sleepAfterYieldDelay)632 public boolean yieldIfContendedSafely(long sleepAfterYieldDelay) { 633 return yieldIfContendedHelper(true /* check yielding */, sleepAfterYieldDelay); 634 } 635 yieldIfContendedHelper(boolean throwIfUnsafe, long sleepAfterYieldDelay)636 private boolean yieldIfContendedHelper(boolean throwIfUnsafe, long sleepAfterYieldDelay) { 637 acquireReference(); 638 try { 639 return getThreadSession().yieldTransaction(sleepAfterYieldDelay, throwIfUnsafe, null); 640 } finally { 641 releaseReference(); 642 } 643 } 644 645 /** 646 * Deprecated. 647 * @deprecated This method no longer serves any useful purpose and has been deprecated. 648 */ 649 @Deprecated getSyncedTables()650 public Map<String, String> getSyncedTables() { 651 return new HashMap<String, String>(0); 652 } 653 654 /** 655 * Open the database according to the flags {@link #OPEN_READWRITE} 656 * {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}. 657 * 658 * <p>Sets the locale of the database to the the system's current locale. 659 * Call {@link #setLocale} if you would like something else.</p> 660 * 661 * @param path to database file to open and/or create 662 * @param factory an optional factory class that is called to instantiate a 663 * cursor when query is called, or null for default 664 * @param flags to control database access mode 665 * @return the newly opened database 666 * @throws SQLiteException if the database cannot be opened 667 */ openDatabase(String path, CursorFactory factory, int flags)668 public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags) { 669 return openDatabase(path, factory, flags, null); 670 } 671 672 /** 673 * Open the database according to the flags {@link #OPEN_READWRITE} 674 * {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}. 675 * 676 * <p>Sets the locale of the database to the the system's current locale. 677 * Call {@link #setLocale} if you would like something else.</p> 678 * 679 * <p>Accepts input param: a concrete instance of {@link DatabaseErrorHandler} to be 680 * used to handle corruption when sqlite reports database corruption.</p> 681 * 682 * @param path to database file to open and/or create 683 * @param factory an optional factory class that is called to instantiate a 684 * cursor when query is called, or null for default 685 * @param flags to control database access mode 686 * @param errorHandler the {@link DatabaseErrorHandler} obj to be used to handle corruption 687 * when sqlite reports database corruption 688 * @return the newly opened database 689 * @throws SQLiteException if the database cannot be opened 690 */ openDatabase(String path, CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)691 public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags, 692 DatabaseErrorHandler errorHandler) { 693 SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler); 694 db.open(); 695 return db; 696 } 697 698 /** 699 * Equivalent to openDatabase(file.getPath(), factory, CREATE_IF_NECESSARY). 700 */ openOrCreateDatabase(File file, CursorFactory factory)701 public static SQLiteDatabase openOrCreateDatabase(File file, CursorFactory factory) { 702 return openOrCreateDatabase(file.getPath(), factory); 703 } 704 705 /** 706 * Equivalent to openDatabase(path, factory, CREATE_IF_NECESSARY). 707 */ openOrCreateDatabase(String path, CursorFactory factory)708 public static SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory) { 709 return openDatabase(path, factory, CREATE_IF_NECESSARY, null); 710 } 711 712 /** 713 * Equivalent to openDatabase(path, factory, CREATE_IF_NECESSARY, errorHandler). 714 */ openOrCreateDatabase(String path, CursorFactory factory, DatabaseErrorHandler errorHandler)715 public static SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory, 716 DatabaseErrorHandler errorHandler) { 717 return openDatabase(path, factory, CREATE_IF_NECESSARY, errorHandler); 718 } 719 720 /** 721 * Deletes a database including its journal file and other auxiliary files 722 * that may have been created by the database engine. 723 * 724 * @param file The database file path. 725 * @return True if the database was successfully deleted. 726 */ deleteDatabase(File file)727 public static boolean deleteDatabase(File file) { 728 if (file == null) { 729 throw new IllegalArgumentException("file must not be null"); 730 } 731 732 boolean deleted = false; 733 deleted |= file.delete(); 734 deleted |= new File(file.getPath() + "-journal").delete(); 735 deleted |= new File(file.getPath() + "-shm").delete(); 736 deleted |= new File(file.getPath() + "-wal").delete(); 737 738 File dir = file.getParentFile(); 739 if (dir != null) { 740 final String prefix = file.getName() + "-mj"; 741 File[] files = dir.listFiles(new FileFilter() { 742 @Override 743 public boolean accept(File candidate) { 744 return candidate.getName().startsWith(prefix); 745 } 746 }); 747 if (files != null) { 748 for (File masterJournal : files) { 749 deleted |= masterJournal.delete(); 750 } 751 } 752 } 753 return deleted; 754 } 755 756 /** 757 * Reopens the database in read-write mode. 758 * If the database is already read-write, does nothing. 759 * 760 * @throws SQLiteException if the database could not be reopened as requested, in which 761 * case it remains open in read only mode. 762 * @throws IllegalStateException if the database is not open. 763 * 764 * @see #isReadOnly() 765 * @hide 766 */ reopenReadWrite()767 public void reopenReadWrite() { 768 synchronized (mLock) { 769 throwIfNotOpenLocked(); 770 771 if (!isReadOnlyLocked()) { 772 return; // nothing to do 773 } 774 775 // Reopen the database in read-write mode. 776 final int oldOpenFlags = mConfigurationLocked.openFlags; 777 mConfigurationLocked.openFlags = (mConfigurationLocked.openFlags & ~OPEN_READ_MASK) 778 | OPEN_READWRITE; 779 try { 780 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 781 } catch (RuntimeException ex) { 782 mConfigurationLocked.openFlags = oldOpenFlags; 783 throw ex; 784 } 785 } 786 } 787 open()788 private void open() { 789 try { 790 try { 791 openInner(); 792 } catch (SQLiteDatabaseCorruptException ex) { 793 onCorruption(); 794 openInner(); 795 } 796 } catch (SQLiteException ex) { 797 Log.e(TAG, "Failed to open database '" + getLabel() + "'.", ex); 798 close(); 799 throw ex; 800 } 801 } 802 openInner()803 private void openInner() { 804 synchronized (mLock) { 805 assert mConnectionPoolLocked == null; 806 mConnectionPoolLocked = SQLiteConnectionPool.open(mConfigurationLocked); 807 mCloseGuardLocked.open("close"); 808 } 809 810 synchronized (sActiveDatabases) { 811 sActiveDatabases.put(this, null); 812 } 813 } 814 815 /** 816 * Create a memory backed SQLite database. Its contents will be destroyed 817 * when the database is closed. 818 * 819 * <p>Sets the locale of the database to the the system's current locale. 820 * Call {@link #setLocale} if you would like something else.</p> 821 * 822 * @param factory an optional factory class that is called to instantiate a 823 * cursor when query is called 824 * @return a SQLiteDatabase object, or null if the database can't be created 825 */ create(CursorFactory factory)826 public static SQLiteDatabase create(CursorFactory factory) { 827 // This is a magic string with special meaning for SQLite. 828 return openDatabase(SQLiteDatabaseConfiguration.MEMORY_DB_PATH, 829 factory, CREATE_IF_NECESSARY); 830 } 831 832 /** 833 * Registers a CustomFunction callback as a function that can be called from 834 * SQLite database triggers. 835 * 836 * @param name the name of the sqlite3 function 837 * @param numArgs the number of arguments for the function 838 * @param function callback to call when the function is executed 839 * @hide 840 */ addCustomFunction(String name, int numArgs, CustomFunction function)841 public void addCustomFunction(String name, int numArgs, CustomFunction function) { 842 // Create wrapper (also validates arguments). 843 SQLiteCustomFunction wrapper = new SQLiteCustomFunction(name, numArgs, function); 844 845 synchronized (mLock) { 846 throwIfNotOpenLocked(); 847 848 mConfigurationLocked.customFunctions.add(wrapper); 849 try { 850 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 851 } catch (RuntimeException ex) { 852 mConfigurationLocked.customFunctions.remove(wrapper); 853 throw ex; 854 } 855 } 856 } 857 858 /** 859 * Gets the database version. 860 * 861 * @return the database version 862 */ getVersion()863 public int getVersion() { 864 return ((Long) DatabaseUtils.longForQuery(this, "PRAGMA user_version;", null)).intValue(); 865 } 866 867 /** 868 * Sets the database version. 869 * 870 * @param version the new database version 871 */ setVersion(int version)872 public void setVersion(int version) { 873 execSQL("PRAGMA user_version = " + version); 874 } 875 876 /** 877 * Returns the maximum size the database may grow to. 878 * 879 * @return the new maximum database size 880 */ getMaximumSize()881 public long getMaximumSize() { 882 long pageCount = DatabaseUtils.longForQuery(this, "PRAGMA max_page_count;", null); 883 return pageCount * getPageSize(); 884 } 885 886 /** 887 * Sets the maximum size the database will grow to. The maximum size cannot 888 * be set below the current size. 889 * 890 * @param numBytes the maximum database size, in bytes 891 * @return the new maximum database size 892 */ setMaximumSize(long numBytes)893 public long setMaximumSize(long numBytes) { 894 long pageSize = getPageSize(); 895 long numPages = numBytes / pageSize; 896 // If numBytes isn't a multiple of pageSize, bump up a page 897 if ((numBytes % pageSize) != 0) { 898 numPages++; 899 } 900 long newPageCount = DatabaseUtils.longForQuery(this, "PRAGMA max_page_count = " + numPages, 901 null); 902 return newPageCount * pageSize; 903 } 904 905 /** 906 * Returns the current database page size, in bytes. 907 * 908 * @return the database page size, in bytes 909 */ getPageSize()910 public long getPageSize() { 911 return DatabaseUtils.longForQuery(this, "PRAGMA page_size;", null); 912 } 913 914 /** 915 * Sets the database page size. The page size must be a power of two. This 916 * method does not work if any data has been written to the database file, 917 * and must be called right after the database has been created. 918 * 919 * @param numBytes the database page size, in bytes 920 */ setPageSize(long numBytes)921 public void setPageSize(long numBytes) { 922 execSQL("PRAGMA page_size = " + numBytes); 923 } 924 925 /** 926 * Mark this table as syncable. When an update occurs in this table the 927 * _sync_dirty field will be set to ensure proper syncing operation. 928 * 929 * @param table the table to mark as syncable 930 * @param deletedTable The deleted table that corresponds to the 931 * syncable table 932 * @deprecated This method no longer serves any useful purpose and has been deprecated. 933 */ 934 @Deprecated markTableSyncable(String table, String deletedTable)935 public void markTableSyncable(String table, String deletedTable) { 936 } 937 938 /** 939 * Mark this table as syncable, with the _sync_dirty residing in another 940 * table. When an update occurs in this table the _sync_dirty field of the 941 * row in updateTable with the _id in foreignKey will be set to 942 * ensure proper syncing operation. 943 * 944 * @param table an update on this table will trigger a sync time removal 945 * @param foreignKey this is the column in table whose value is an _id in 946 * updateTable 947 * @param updateTable this is the table that will have its _sync_dirty 948 * @deprecated This method no longer serves any useful purpose and has been deprecated. 949 */ 950 @Deprecated markTableSyncable(String table, String foreignKey, String updateTable)951 public void markTableSyncable(String table, String foreignKey, String updateTable) { 952 } 953 954 /** 955 * Finds the name of the first table, which is editable. 956 * 957 * @param tables a list of tables 958 * @return the first table listed 959 */ findEditTable(String tables)960 public static String findEditTable(String tables) { 961 if (!TextUtils.isEmpty(tables)) { 962 // find the first word terminated by either a space or a comma 963 int spacepos = tables.indexOf(' '); 964 int commapos = tables.indexOf(','); 965 966 if (spacepos > 0 && (spacepos < commapos || commapos < 0)) { 967 return tables.substring(0, spacepos); 968 } else if (commapos > 0 && (commapos < spacepos || spacepos < 0) ) { 969 return tables.substring(0, commapos); 970 } 971 return tables; 972 } else { 973 throw new IllegalStateException("Invalid tables"); 974 } 975 } 976 977 /** 978 * Compiles an SQL statement into a reusable pre-compiled statement object. 979 * The parameters are identical to {@link #execSQL(String)}. You may put ?s in the 980 * statement and fill in those values with {@link SQLiteProgram#bindString} 981 * and {@link SQLiteProgram#bindLong} each time you want to run the 982 * statement. Statements may not return result sets larger than 1x1. 983 *<p> 984 * No two threads should be using the same {@link SQLiteStatement} at the same time. 985 * 986 * @param sql The raw SQL statement, may contain ? for unknown values to be 987 * bound later. 988 * @return A pre-compiled {@link SQLiteStatement} object. Note that 989 * {@link SQLiteStatement}s are not synchronized, see the documentation for more details. 990 */ compileStatement(String sql)991 public SQLiteStatement compileStatement(String sql) throws SQLException { 992 acquireReference(); 993 try { 994 return new SQLiteStatement(this, sql, null); 995 } finally { 996 releaseReference(); 997 } 998 } 999 1000 /** 1001 * Query the given URL, returning a {@link Cursor} over the result set. 1002 * 1003 * @param distinct true if you want each row to be unique, false otherwise. 1004 * @param table The table name to compile the query against. 1005 * @param columns A list of which columns to return. Passing null will 1006 * return all columns, which is discouraged to prevent reading 1007 * data from storage that isn't going to be used. 1008 * @param selection A filter declaring which rows to return, formatted as an 1009 * SQL WHERE clause (excluding the WHERE itself). Passing null 1010 * will return all rows for the given table. 1011 * @param selectionArgs You may include ?s in selection, which will be 1012 * replaced by the values from selectionArgs, in order that they 1013 * appear in the selection. The values will be bound as Strings. 1014 * @param groupBy A filter declaring how to group rows, formatted as an SQL 1015 * GROUP BY clause (excluding the GROUP BY itself). Passing null 1016 * will cause the rows to not be grouped. 1017 * @param having A filter declare which row groups to include in the cursor, 1018 * if row grouping is being used, formatted as an SQL HAVING 1019 * clause (excluding the HAVING itself). Passing null will cause 1020 * all row groups to be included, and is required when row 1021 * grouping is not being used. 1022 * @param orderBy How to order the rows, formatted as an SQL ORDER BY clause 1023 * (excluding the ORDER BY itself). Passing null will use the 1024 * default sort order, which may be unordered. 1025 * @param limit Limits the number of rows returned by the query, 1026 * formatted as LIMIT clause. Passing null denotes no LIMIT clause. 1027 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1028 * {@link Cursor}s are not synchronized, see the documentation for more details. 1029 * @see Cursor 1030 */ query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)1031 public Cursor query(boolean distinct, String table, String[] columns, 1032 String selection, String[] selectionArgs, String groupBy, 1033 String having, String orderBy, String limit) { 1034 return queryWithFactory(null, distinct, table, columns, selection, selectionArgs, 1035 groupBy, having, orderBy, limit, null); 1036 } 1037 1038 /** 1039 * Query the given URL, returning a {@link Cursor} over the result set. 1040 * 1041 * @param distinct true if you want each row to be unique, false otherwise. 1042 * @param table The table name to compile the query against. 1043 * @param columns A list of which columns to return. Passing null will 1044 * return all columns, which is discouraged to prevent reading 1045 * data from storage that isn't going to be used. 1046 * @param selection A filter declaring which rows to return, formatted as an 1047 * SQL WHERE clause (excluding the WHERE itself). Passing null 1048 * will return all rows for the given table. 1049 * @param selectionArgs You may include ?s in selection, which will be 1050 * replaced by the values from selectionArgs, in order that they 1051 * appear in the selection. The values will be bound as Strings. 1052 * @param groupBy A filter declaring how to group rows, formatted as an SQL 1053 * GROUP BY clause (excluding the GROUP BY itself). Passing null 1054 * will cause the rows to not be grouped. 1055 * @param having A filter declare which row groups to include in the cursor, 1056 * if row grouping is being used, formatted as an SQL HAVING 1057 * clause (excluding the HAVING itself). Passing null will cause 1058 * all row groups to be included, and is required when row 1059 * grouping is not being used. 1060 * @param orderBy How to order the rows, formatted as an SQL ORDER BY clause 1061 * (excluding the ORDER BY itself). Passing null will use the 1062 * default sort order, which may be unordered. 1063 * @param limit Limits the number of rows returned by the query, 1064 * formatted as LIMIT clause. Passing null denotes no LIMIT clause. 1065 * @param cancellationSignal A signal to cancel the operation in progress, or null if none. 1066 * If the operation is canceled, then {@link OperationCanceledException} will be thrown 1067 * when the query is executed. 1068 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1069 * {@link Cursor}s are not synchronized, see the documentation for more details. 1070 * @see Cursor 1071 */ query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal)1072 public Cursor query(boolean distinct, String table, String[] columns, 1073 String selection, String[] selectionArgs, String groupBy, 1074 String having, String orderBy, String limit, CancellationSignal cancellationSignal) { 1075 return queryWithFactory(null, distinct, table, columns, selection, selectionArgs, 1076 groupBy, having, orderBy, limit, cancellationSignal); 1077 } 1078 1079 /** 1080 * Query the given URL, returning a {@link Cursor} over the result set. 1081 * 1082 * @param cursorFactory the cursor factory to use, or null for the default factory 1083 * @param distinct true if you want each row to be unique, false otherwise. 1084 * @param table The table name to compile the query against. 1085 * @param columns A list of which columns to return. Passing null will 1086 * return all columns, which is discouraged to prevent reading 1087 * data from storage that isn't going to be used. 1088 * @param selection A filter declaring which rows to return, formatted as an 1089 * SQL WHERE clause (excluding the WHERE itself). Passing null 1090 * will return all rows for the given table. 1091 * @param selectionArgs You may include ?s in selection, which will be 1092 * replaced by the values from selectionArgs, in order that they 1093 * appear in the selection. The values will be bound as Strings. 1094 * @param groupBy A filter declaring how to group rows, formatted as an SQL 1095 * GROUP BY clause (excluding the GROUP BY itself). Passing null 1096 * will cause the rows to not be grouped. 1097 * @param having A filter declare which row groups to include in the cursor, 1098 * if row grouping is being used, formatted as an SQL HAVING 1099 * clause (excluding the HAVING itself). Passing null will cause 1100 * all row groups to be included, and is required when row 1101 * grouping is not being used. 1102 * @param orderBy How to order the rows, formatted as an SQL ORDER BY clause 1103 * (excluding the ORDER BY itself). Passing null will use the 1104 * default sort order, which may be unordered. 1105 * @param limit Limits the number of rows returned by the query, 1106 * formatted as LIMIT clause. Passing null denotes no LIMIT clause. 1107 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1108 * {@link Cursor}s are not synchronized, see the documentation for more details. 1109 * @see Cursor 1110 */ queryWithFactory(CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)1111 public Cursor queryWithFactory(CursorFactory cursorFactory, 1112 boolean distinct, String table, String[] columns, 1113 String selection, String[] selectionArgs, String groupBy, 1114 String having, String orderBy, String limit) { 1115 return queryWithFactory(cursorFactory, distinct, table, columns, selection, 1116 selectionArgs, groupBy, having, orderBy, limit, null); 1117 } 1118 1119 /** 1120 * Query the given URL, returning a {@link Cursor} over the result set. 1121 * 1122 * @param cursorFactory the cursor factory to use, or null for the default factory 1123 * @param distinct true if you want each row to be unique, false otherwise. 1124 * @param table The table name to compile the query against. 1125 * @param columns A list of which columns to return. Passing null will 1126 * return all columns, which is discouraged to prevent reading 1127 * data from storage that isn't going to be used. 1128 * @param selection A filter declaring which rows to return, formatted as an 1129 * SQL WHERE clause (excluding the WHERE itself). Passing null 1130 * will return all rows for the given table. 1131 * @param selectionArgs You may include ?s in selection, which will be 1132 * replaced by the values from selectionArgs, in order that they 1133 * appear in the selection. The values will be bound as Strings. 1134 * @param groupBy A filter declaring how to group rows, formatted as an SQL 1135 * GROUP BY clause (excluding the GROUP BY itself). Passing null 1136 * will cause the rows to not be grouped. 1137 * @param having A filter declare which row groups to include in the cursor, 1138 * if row grouping is being used, formatted as an SQL HAVING 1139 * clause (excluding the HAVING itself). Passing null will cause 1140 * all row groups to be included, and is required when row 1141 * grouping is not being used. 1142 * @param orderBy How to order the rows, formatted as an SQL ORDER BY clause 1143 * (excluding the ORDER BY itself). Passing null will use the 1144 * default sort order, which may be unordered. 1145 * @param limit Limits the number of rows returned by the query, 1146 * formatted as LIMIT clause. Passing null denotes no LIMIT clause. 1147 * @param cancellationSignal A signal to cancel the operation in progress, or null if none. 1148 * If the operation is canceled, then {@link OperationCanceledException} will be thrown 1149 * when the query is executed. 1150 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1151 * {@link Cursor}s are not synchronized, see the documentation for more details. 1152 * @see Cursor 1153 */ queryWithFactory(CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal)1154 public Cursor queryWithFactory(CursorFactory cursorFactory, 1155 boolean distinct, String table, String[] columns, 1156 String selection, String[] selectionArgs, String groupBy, 1157 String having, String orderBy, String limit, CancellationSignal cancellationSignal) { 1158 acquireReference(); 1159 try { 1160 String sql = SQLiteQueryBuilder.buildQueryString( 1161 distinct, table, columns, selection, groupBy, having, orderBy, limit); 1162 1163 return rawQueryWithFactory(cursorFactory, sql, selectionArgs, 1164 findEditTable(table), cancellationSignal); 1165 } finally { 1166 releaseReference(); 1167 } 1168 } 1169 1170 /** 1171 * Query the given table, returning a {@link Cursor} over the result set. 1172 * 1173 * @param table The table name to compile the query against. 1174 * @param columns A list of which columns to return. Passing null will 1175 * return all columns, which is discouraged to prevent reading 1176 * data from storage that isn't going to be used. 1177 * @param selection A filter declaring which rows to return, formatted as an 1178 * SQL WHERE clause (excluding the WHERE itself). Passing null 1179 * will return all rows for the given table. 1180 * @param selectionArgs You may include ?s in selection, which will be 1181 * replaced by the values from selectionArgs, in order that they 1182 * appear in the selection. The values will be bound as Strings. 1183 * @param groupBy A filter declaring how to group rows, formatted as an SQL 1184 * GROUP BY clause (excluding the GROUP BY itself). Passing null 1185 * will cause the rows to not be grouped. 1186 * @param having A filter declare which row groups to include in the cursor, 1187 * if row grouping is being used, formatted as an SQL HAVING 1188 * clause (excluding the HAVING itself). Passing null will cause 1189 * all row groups to be included, and is required when row 1190 * grouping is not being used. 1191 * @param orderBy How to order the rows, formatted as an SQL ORDER BY clause 1192 * (excluding the ORDER BY itself). Passing null will use the 1193 * default sort order, which may be unordered. 1194 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1195 * {@link Cursor}s are not synchronized, see the documentation for more details. 1196 * @see Cursor 1197 */ query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)1198 public Cursor query(String table, String[] columns, String selection, 1199 String[] selectionArgs, String groupBy, String having, 1200 String orderBy) { 1201 1202 return query(false, table, columns, selection, selectionArgs, groupBy, 1203 having, orderBy, null /* limit */); 1204 } 1205 1206 /** 1207 * Query the given table, returning a {@link Cursor} over the result set. 1208 * 1209 * @param table The table name to compile the query against. 1210 * @param columns A list of which columns to return. Passing null will 1211 * return all columns, which is discouraged to prevent reading 1212 * data from storage that isn't going to be used. 1213 * @param selection A filter declaring which rows to return, formatted as an 1214 * SQL WHERE clause (excluding the WHERE itself). Passing null 1215 * will return all rows for the given table. 1216 * @param selectionArgs You may include ?s in selection, which will be 1217 * replaced by the values from selectionArgs, in order that they 1218 * appear in the selection. The values will be bound as Strings. 1219 * @param groupBy A filter declaring how to group rows, formatted as an SQL 1220 * GROUP BY clause (excluding the GROUP BY itself). Passing null 1221 * will cause the rows to not be grouped. 1222 * @param having A filter declare which row groups to include in the cursor, 1223 * if row grouping is being used, formatted as an SQL HAVING 1224 * clause (excluding the HAVING itself). Passing null will cause 1225 * all row groups to be included, and is required when row 1226 * grouping is not being used. 1227 * @param orderBy How to order the rows, formatted as an SQL ORDER BY clause 1228 * (excluding the ORDER BY itself). Passing null will use the 1229 * default sort order, which may be unordered. 1230 * @param limit Limits the number of rows returned by the query, 1231 * formatted as LIMIT clause. Passing null denotes no LIMIT clause. 1232 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1233 * {@link Cursor}s are not synchronized, see the documentation for more details. 1234 * @see Cursor 1235 */ query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)1236 public Cursor query(String table, String[] columns, String selection, 1237 String[] selectionArgs, String groupBy, String having, 1238 String orderBy, String limit) { 1239 1240 return query(false, table, columns, selection, selectionArgs, groupBy, 1241 having, orderBy, limit); 1242 } 1243 1244 /** 1245 * Runs the provided SQL and returns a {@link Cursor} over the result set. 1246 * 1247 * @param sql the SQL query. The SQL string must not be ; terminated 1248 * @param selectionArgs You may include ?s in where clause in the query, 1249 * which will be replaced by the values from selectionArgs. The 1250 * values will be bound as Strings. 1251 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1252 * {@link Cursor}s are not synchronized, see the documentation for more details. 1253 */ rawQuery(String sql, String[] selectionArgs)1254 public Cursor rawQuery(String sql, String[] selectionArgs) { 1255 return rawQueryWithFactory(null, sql, selectionArgs, null, null); 1256 } 1257 1258 /** 1259 * Runs the provided SQL and returns a {@link Cursor} over the result set. 1260 * 1261 * @param sql the SQL query. The SQL string must not be ; terminated 1262 * @param selectionArgs You may include ?s in where clause in the query, 1263 * which will be replaced by the values from selectionArgs. The 1264 * values will be bound as Strings. 1265 * @param cancellationSignal A signal to cancel the operation in progress, or null if none. 1266 * If the operation is canceled, then {@link OperationCanceledException} will be thrown 1267 * when the query is executed. 1268 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1269 * {@link Cursor}s are not synchronized, see the documentation for more details. 1270 */ rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)1271 public Cursor rawQuery(String sql, String[] selectionArgs, 1272 CancellationSignal cancellationSignal) { 1273 return rawQueryWithFactory(null, sql, selectionArgs, null, cancellationSignal); 1274 } 1275 1276 /** 1277 * Runs the provided SQL and returns a cursor over the result set. 1278 * 1279 * @param cursorFactory the cursor factory to use, or null for the default factory 1280 * @param sql the SQL query. The SQL string must not be ; terminated 1281 * @param selectionArgs You may include ?s in where clause in the query, 1282 * which will be replaced by the values from selectionArgs. The 1283 * values will be bound as Strings. 1284 * @param editTable the name of the first table, which is editable 1285 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1286 * {@link Cursor}s are not synchronized, see the documentation for more details. 1287 */ rawQueryWithFactory( CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable)1288 public Cursor rawQueryWithFactory( 1289 CursorFactory cursorFactory, String sql, String[] selectionArgs, 1290 String editTable) { 1291 return rawQueryWithFactory(cursorFactory, sql, selectionArgs, editTable, null); 1292 } 1293 1294 /** 1295 * Runs the provided SQL and returns a cursor over the result set. 1296 * 1297 * @param cursorFactory the cursor factory to use, or null for the default factory 1298 * @param sql the SQL query. The SQL string must not be ; terminated 1299 * @param selectionArgs You may include ?s in where clause in the query, 1300 * which will be replaced by the values from selectionArgs. The 1301 * values will be bound as Strings. 1302 * @param editTable the name of the first table, which is editable 1303 * @param cancellationSignal A signal to cancel the operation in progress, or null if none. 1304 * If the operation is canceled, then {@link OperationCanceledException} will be thrown 1305 * when the query is executed. 1306 * @return A {@link Cursor} object, which is positioned before the first entry. Note that 1307 * {@link Cursor}s are not synchronized, see the documentation for more details. 1308 */ rawQueryWithFactory( CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable, CancellationSignal cancellationSignal)1309 public Cursor rawQueryWithFactory( 1310 CursorFactory cursorFactory, String sql, String[] selectionArgs, 1311 String editTable, CancellationSignal cancellationSignal) { 1312 acquireReference(); 1313 try { 1314 SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(this, sql, editTable, 1315 cancellationSignal); 1316 return driver.query(cursorFactory != null ? cursorFactory : mCursorFactory, 1317 selectionArgs); 1318 } finally { 1319 releaseReference(); 1320 } 1321 } 1322 1323 /** 1324 * Convenience method for inserting a row into the database. 1325 * 1326 * @param table the table to insert the row into 1327 * @param nullColumnHack optional; may be <code>null</code>. 1328 * SQL doesn't allow inserting a completely empty row without 1329 * naming at least one column name. If your provided <code>values</code> is 1330 * empty, no column names are known and an empty row can't be inserted. 1331 * If not set to null, the <code>nullColumnHack</code> parameter 1332 * provides the name of nullable column name to explicitly insert a NULL into 1333 * in the case where your <code>values</code> is empty. 1334 * @param values this map contains the initial column values for the 1335 * row. The keys should be the column names and the values the 1336 * column values 1337 * @return the row ID of the newly inserted row, or -1 if an error occurred 1338 */ insert(String table, String nullColumnHack, ContentValues values)1339 public long insert(String table, String nullColumnHack, ContentValues values) { 1340 try { 1341 return insertWithOnConflict(table, nullColumnHack, values, CONFLICT_NONE); 1342 } catch (SQLException e) { 1343 Log.e(TAG, "Error inserting " + values, e); 1344 return -1; 1345 } 1346 } 1347 1348 /** 1349 * Convenience method for inserting a row into the database. 1350 * 1351 * @param table the table to insert the row into 1352 * @param nullColumnHack optional; may be <code>null</code>. 1353 * SQL doesn't allow inserting a completely empty row without 1354 * naming at least one column name. If your provided <code>values</code> is 1355 * empty, no column names are known and an empty row can't be inserted. 1356 * If not set to null, the <code>nullColumnHack</code> parameter 1357 * provides the name of nullable column name to explicitly insert a NULL into 1358 * in the case where your <code>values</code> is empty. 1359 * @param values this map contains the initial column values for the 1360 * row. The keys should be the column names and the values the 1361 * column values 1362 * @throws SQLException 1363 * @return the row ID of the newly inserted row, or -1 if an error occurred 1364 */ insertOrThrow(String table, String nullColumnHack, ContentValues values)1365 public long insertOrThrow(String table, String nullColumnHack, ContentValues values) 1366 throws SQLException { 1367 return insertWithOnConflict(table, nullColumnHack, values, CONFLICT_NONE); 1368 } 1369 1370 /** 1371 * Convenience method for replacing a row in the database. 1372 * 1373 * @param table the table in which to replace the row 1374 * @param nullColumnHack optional; may be <code>null</code>. 1375 * SQL doesn't allow inserting a completely empty row without 1376 * naming at least one column name. If your provided <code>initialValues</code> is 1377 * empty, no column names are known and an empty row can't be inserted. 1378 * If not set to null, the <code>nullColumnHack</code> parameter 1379 * provides the name of nullable column name to explicitly insert a NULL into 1380 * in the case where your <code>initialValues</code> is empty. 1381 * @param initialValues this map contains the initial column values for 1382 * the row. 1383 * @return the row ID of the newly inserted row, or -1 if an error occurred 1384 */ replace(String table, String nullColumnHack, ContentValues initialValues)1385 public long replace(String table, String nullColumnHack, ContentValues initialValues) { 1386 try { 1387 return insertWithOnConflict(table, nullColumnHack, initialValues, 1388 CONFLICT_REPLACE); 1389 } catch (SQLException e) { 1390 Log.e(TAG, "Error inserting " + initialValues, e); 1391 return -1; 1392 } 1393 } 1394 1395 /** 1396 * Convenience method for replacing a row in the database. 1397 * 1398 * @param table the table in which to replace the row 1399 * @param nullColumnHack optional; may be <code>null</code>. 1400 * SQL doesn't allow inserting a completely empty row without 1401 * naming at least one column name. If your provided <code>initialValues</code> is 1402 * empty, no column names are known and an empty row can't be inserted. 1403 * If not set to null, the <code>nullColumnHack</code> parameter 1404 * provides the name of nullable column name to explicitly insert a NULL into 1405 * in the case where your <code>initialValues</code> is empty. 1406 * @param initialValues this map contains the initial column values for 1407 * the row. The key 1408 * @throws SQLException 1409 * @return the row ID of the newly inserted row, or -1 if an error occurred 1410 */ replaceOrThrow(String table, String nullColumnHack, ContentValues initialValues)1411 public long replaceOrThrow(String table, String nullColumnHack, 1412 ContentValues initialValues) throws SQLException { 1413 return insertWithOnConflict(table, nullColumnHack, initialValues, 1414 CONFLICT_REPLACE); 1415 } 1416 1417 /** 1418 * General method for inserting a row into the database. 1419 * 1420 * @param table the table to insert the row into 1421 * @param nullColumnHack optional; may be <code>null</code>. 1422 * SQL doesn't allow inserting a completely empty row without 1423 * naming at least one column name. If your provided <code>initialValues</code> is 1424 * empty, no column names are known and an empty row can't be inserted. 1425 * If not set to null, the <code>nullColumnHack</code> parameter 1426 * provides the name of nullable column name to explicitly insert a NULL into 1427 * in the case where your <code>initialValues</code> is empty. 1428 * @param initialValues this map contains the initial column values for the 1429 * row. The keys should be the column names and the values the 1430 * column values 1431 * @param conflictAlgorithm for insert conflict resolver 1432 * @return the row ID of the newly inserted row 1433 * OR the primary key of the existing row if the input param 'conflictAlgorithm' = 1434 * {@link #CONFLICT_IGNORE} 1435 * OR -1 if any error 1436 */ insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm)1437 public long insertWithOnConflict(String table, String nullColumnHack, 1438 ContentValues initialValues, int conflictAlgorithm) { 1439 acquireReference(); 1440 try { 1441 StringBuilder sql = new StringBuilder(); 1442 sql.append("INSERT"); 1443 sql.append(CONFLICT_VALUES[conflictAlgorithm]); 1444 sql.append(" INTO "); 1445 sql.append(table); 1446 sql.append('('); 1447 1448 Object[] bindArgs = null; 1449 int size = (initialValues != null && initialValues.size() > 0) 1450 ? initialValues.size() : 0; 1451 if (size > 0) { 1452 bindArgs = new Object[size]; 1453 int i = 0; 1454 for (String colName : initialValues.keySet()) { 1455 sql.append((i > 0) ? "," : ""); 1456 sql.append(colName); 1457 bindArgs[i++] = initialValues.get(colName); 1458 } 1459 sql.append(')'); 1460 sql.append(" VALUES ("); 1461 for (i = 0; i < size; i++) { 1462 sql.append((i > 0) ? ",?" : "?"); 1463 } 1464 } else { 1465 sql.append(nullColumnHack + ") VALUES (NULL"); 1466 } 1467 sql.append(')'); 1468 1469 SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs); 1470 try { 1471 return statement.executeInsert(); 1472 } finally { 1473 statement.close(); 1474 } 1475 } finally { 1476 releaseReference(); 1477 } 1478 } 1479 1480 /** 1481 * Convenience method for deleting rows in the database. 1482 * 1483 * @param table the table to delete from 1484 * @param whereClause the optional WHERE clause to apply when deleting. 1485 * Passing null will delete all rows. 1486 * @param whereArgs You may include ?s in the where clause, which 1487 * will be replaced by the values from whereArgs. The values 1488 * will be bound as Strings. 1489 * @return the number of rows affected if a whereClause is passed in, 0 1490 * otherwise. To remove all rows and get a count pass "1" as the 1491 * whereClause. 1492 */ delete(String table, String whereClause, String[] whereArgs)1493 public int delete(String table, String whereClause, String[] whereArgs) { 1494 acquireReference(); 1495 try { 1496 SQLiteStatement statement = new SQLiteStatement(this, "DELETE FROM " + table + 1497 (!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs); 1498 try { 1499 return statement.executeUpdateDelete(); 1500 } finally { 1501 statement.close(); 1502 } 1503 } finally { 1504 releaseReference(); 1505 } 1506 } 1507 1508 /** 1509 * Convenience method for updating rows in the database. 1510 * 1511 * @param table the table to update in 1512 * @param values a map from column names to new column values. null is a 1513 * valid value that will be translated to NULL. 1514 * @param whereClause the optional WHERE clause to apply when updating. 1515 * Passing null will update all rows. 1516 * @param whereArgs You may include ?s in the where clause, which 1517 * will be replaced by the values from whereArgs. The values 1518 * will be bound as Strings. 1519 * @return the number of rows affected 1520 */ update(String table, ContentValues values, String whereClause, String[] whereArgs)1521 public int update(String table, ContentValues values, String whereClause, String[] whereArgs) { 1522 return updateWithOnConflict(table, values, whereClause, whereArgs, CONFLICT_NONE); 1523 } 1524 1525 /** 1526 * Convenience method for updating rows in the database. 1527 * 1528 * @param table the table to update in 1529 * @param values a map from column names to new column values. null is a 1530 * valid value that will be translated to NULL. 1531 * @param whereClause the optional WHERE clause to apply when updating. 1532 * Passing null will update all rows. 1533 * @param whereArgs You may include ?s in the where clause, which 1534 * will be replaced by the values from whereArgs. The values 1535 * will be bound as Strings. 1536 * @param conflictAlgorithm for update conflict resolver 1537 * @return the number of rows affected 1538 */ updateWithOnConflict(String table, ContentValues values, String whereClause, String[] whereArgs, int conflictAlgorithm)1539 public int updateWithOnConflict(String table, ContentValues values, 1540 String whereClause, String[] whereArgs, int conflictAlgorithm) { 1541 if (values == null || values.size() == 0) { 1542 throw new IllegalArgumentException("Empty values"); 1543 } 1544 1545 acquireReference(); 1546 try { 1547 StringBuilder sql = new StringBuilder(120); 1548 sql.append("UPDATE "); 1549 sql.append(CONFLICT_VALUES[conflictAlgorithm]); 1550 sql.append(table); 1551 sql.append(" SET "); 1552 1553 // move all bind args to one array 1554 int setValuesSize = values.size(); 1555 int bindArgsSize = (whereArgs == null) ? setValuesSize : (setValuesSize + whereArgs.length); 1556 Object[] bindArgs = new Object[bindArgsSize]; 1557 int i = 0; 1558 for (String colName : values.keySet()) { 1559 sql.append((i > 0) ? "," : ""); 1560 sql.append(colName); 1561 bindArgs[i++] = values.get(colName); 1562 sql.append("=?"); 1563 } 1564 if (whereArgs != null) { 1565 for (i = setValuesSize; i < bindArgsSize; i++) { 1566 bindArgs[i] = whereArgs[i - setValuesSize]; 1567 } 1568 } 1569 if (!TextUtils.isEmpty(whereClause)) { 1570 sql.append(" WHERE "); 1571 sql.append(whereClause); 1572 } 1573 1574 SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs); 1575 try { 1576 return statement.executeUpdateDelete(); 1577 } finally { 1578 statement.close(); 1579 } 1580 } finally { 1581 releaseReference(); 1582 } 1583 } 1584 1585 /** 1586 * Execute a single SQL statement that is NOT a SELECT 1587 * or any other SQL statement that returns data. 1588 * <p> 1589 * It has no means to return any data (such as the number of affected rows). 1590 * Instead, you're encouraged to use {@link #insert(String, String, ContentValues)}, 1591 * {@link #update(String, ContentValues, String, String[])}, et al, when possible. 1592 * </p> 1593 * <p> 1594 * When using {@link #enableWriteAheadLogging()}, journal_mode is 1595 * automatically managed by this class. So, do not set journal_mode 1596 * using "PRAGMA journal_mode'<value>" statement if your app is using 1597 * {@link #enableWriteAheadLogging()} 1598 * </p> 1599 * 1600 * @param sql the SQL statement to be executed. Multiple statements separated by semicolons are 1601 * not supported. 1602 * @throws SQLException if the SQL string is invalid 1603 */ execSQL(String sql)1604 public void execSQL(String sql) throws SQLException { 1605 executeSql(sql, null); 1606 } 1607 1608 /** 1609 * Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE. 1610 * <p> 1611 * For INSERT statements, use any of the following instead. 1612 * <ul> 1613 * <li>{@link #insert(String, String, ContentValues)}</li> 1614 * <li>{@link #insertOrThrow(String, String, ContentValues)}</li> 1615 * <li>{@link #insertWithOnConflict(String, String, ContentValues, int)}</li> 1616 * </ul> 1617 * <p> 1618 * For UPDATE statements, use any of the following instead. 1619 * <ul> 1620 * <li>{@link #update(String, ContentValues, String, String[])}</li> 1621 * <li>{@link #updateWithOnConflict(String, ContentValues, String, String[], int)}</li> 1622 * </ul> 1623 * <p> 1624 * For DELETE statements, use any of the following instead. 1625 * <ul> 1626 * <li>{@link #delete(String, String, String[])}</li> 1627 * </ul> 1628 * <p> 1629 * For example, the following are good candidates for using this method: 1630 * <ul> 1631 * <li>ALTER TABLE</li> 1632 * <li>CREATE or DROP table / trigger / view / index / virtual table</li> 1633 * <li>REINDEX</li> 1634 * <li>RELEASE</li> 1635 * <li>SAVEPOINT</li> 1636 * <li>PRAGMA that returns no data</li> 1637 * </ul> 1638 * </p> 1639 * <p> 1640 * When using {@link #enableWriteAheadLogging()}, journal_mode is 1641 * automatically managed by this class. So, do not set journal_mode 1642 * using "PRAGMA journal_mode'<value>" statement if your app is using 1643 * {@link #enableWriteAheadLogging()} 1644 * </p> 1645 * 1646 * @param sql the SQL statement to be executed. Multiple statements separated by semicolons are 1647 * not supported. 1648 * @param bindArgs only byte[], String, Long and Double are supported in bindArgs. 1649 * @throws SQLException if the SQL string is invalid 1650 */ execSQL(String sql, Object[] bindArgs)1651 public void execSQL(String sql, Object[] bindArgs) throws SQLException { 1652 if (bindArgs == null) { 1653 throw new IllegalArgumentException("Empty bindArgs"); 1654 } 1655 executeSql(sql, bindArgs); 1656 } 1657 executeSql(String sql, Object[] bindArgs)1658 private int executeSql(String sql, Object[] bindArgs) throws SQLException { 1659 acquireReference(); 1660 try { 1661 if (DatabaseUtils.getSqlStatementType(sql) == DatabaseUtils.STATEMENT_ATTACH) { 1662 boolean disableWal = false; 1663 synchronized (mLock) { 1664 if (!mHasAttachedDbsLocked) { 1665 mHasAttachedDbsLocked = true; 1666 disableWal = true; 1667 } 1668 } 1669 if (disableWal) { 1670 disableWriteAheadLogging(); 1671 } 1672 } 1673 1674 SQLiteStatement statement = new SQLiteStatement(this, sql, bindArgs); 1675 try { 1676 return statement.executeUpdateDelete(); 1677 } finally { 1678 statement.close(); 1679 } 1680 } finally { 1681 releaseReference(); 1682 } 1683 } 1684 1685 /** 1686 * Returns true if the database is opened as read only. 1687 * 1688 * @return True if database is opened as read only. 1689 */ isReadOnly()1690 public boolean isReadOnly() { 1691 synchronized (mLock) { 1692 return isReadOnlyLocked(); 1693 } 1694 } 1695 isReadOnlyLocked()1696 private boolean isReadOnlyLocked() { 1697 return (mConfigurationLocked.openFlags & OPEN_READ_MASK) == OPEN_READONLY; 1698 } 1699 1700 /** 1701 * Returns true if the database is in-memory db. 1702 * 1703 * @return True if the database is in-memory. 1704 * @hide 1705 */ isInMemoryDatabase()1706 public boolean isInMemoryDatabase() { 1707 synchronized (mLock) { 1708 return mConfigurationLocked.isInMemoryDb(); 1709 } 1710 } 1711 1712 /** 1713 * Returns true if the database is currently open. 1714 * 1715 * @return True if the database is currently open (has not been closed). 1716 */ isOpen()1717 public boolean isOpen() { 1718 synchronized (mLock) { 1719 return mConnectionPoolLocked != null; 1720 } 1721 } 1722 1723 /** 1724 * Returns true if the new version code is greater than the current database version. 1725 * 1726 * @param newVersion The new version code. 1727 * @return True if the new version code is greater than the current database version. 1728 */ needUpgrade(int newVersion)1729 public boolean needUpgrade(int newVersion) { 1730 return newVersion > getVersion(); 1731 } 1732 1733 /** 1734 * Gets the path to the database file. 1735 * 1736 * @return The path to the database file. 1737 */ getPath()1738 public final String getPath() { 1739 synchronized (mLock) { 1740 return mConfigurationLocked.path; 1741 } 1742 } 1743 1744 /** 1745 * Sets the locale for this database. Does nothing if this database has 1746 * the {@link #NO_LOCALIZED_COLLATORS} flag set or was opened read only. 1747 * 1748 * @param locale The new locale. 1749 * 1750 * @throws SQLException if the locale could not be set. The most common reason 1751 * for this is that there is no collator available for the locale you requested. 1752 * In this case the database remains unchanged. 1753 */ setLocale(Locale locale)1754 public void setLocale(Locale locale) { 1755 if (locale == null) { 1756 throw new IllegalArgumentException("locale must not be null."); 1757 } 1758 1759 synchronized (mLock) { 1760 throwIfNotOpenLocked(); 1761 1762 final Locale oldLocale = mConfigurationLocked.locale; 1763 mConfigurationLocked.locale = locale; 1764 try { 1765 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 1766 } catch (RuntimeException ex) { 1767 mConfigurationLocked.locale = oldLocale; 1768 throw ex; 1769 } 1770 } 1771 } 1772 1773 /** 1774 * Sets the maximum size of the prepared-statement cache for this database. 1775 * (size of the cache = number of compiled-sql-statements stored in the cache). 1776 *<p> 1777 * Maximum cache size can ONLY be increased from its current size (default = 10). 1778 * If this method is called with smaller size than the current maximum value, 1779 * then IllegalStateException is thrown. 1780 *<p> 1781 * This method is thread-safe. 1782 * 1783 * @param cacheSize the size of the cache. can be (0 to {@link #MAX_SQL_CACHE_SIZE}) 1784 * @throws IllegalStateException if input cacheSize > {@link #MAX_SQL_CACHE_SIZE}. 1785 */ setMaxSqlCacheSize(int cacheSize)1786 public void setMaxSqlCacheSize(int cacheSize) { 1787 if (cacheSize > MAX_SQL_CACHE_SIZE || cacheSize < 0) { 1788 throw new IllegalStateException( 1789 "expected value between 0 and " + MAX_SQL_CACHE_SIZE); 1790 } 1791 1792 synchronized (mLock) { 1793 throwIfNotOpenLocked(); 1794 1795 final int oldMaxSqlCacheSize = mConfigurationLocked.maxSqlCacheSize; 1796 mConfigurationLocked.maxSqlCacheSize = cacheSize; 1797 try { 1798 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 1799 } catch (RuntimeException ex) { 1800 mConfigurationLocked.maxSqlCacheSize = oldMaxSqlCacheSize; 1801 throw ex; 1802 } 1803 } 1804 } 1805 1806 /** 1807 * Sets whether foreign key constraints are enabled for the database. 1808 * <p> 1809 * By default, foreign key constraints are not enforced by the database. 1810 * This method allows an application to enable foreign key constraints. 1811 * It must be called each time the database is opened to ensure that foreign 1812 * key constraints are enabled for the session. 1813 * </p><p> 1814 * A good time to call this method is right after calling {@link #openOrCreateDatabase} 1815 * or in the {@link SQLiteOpenHelper#onConfigure} callback. 1816 * </p><p> 1817 * When foreign key constraints are disabled, the database does not check whether 1818 * changes to the database will violate foreign key constraints. Likewise, when 1819 * foreign key constraints are disabled, the database will not execute cascade 1820 * delete or update triggers. As a result, it is possible for the database 1821 * state to become inconsistent. To perform a database integrity check, 1822 * call {@link #isDatabaseIntegrityOk}. 1823 * </p><p> 1824 * This method must not be called while a transaction is in progress. 1825 * </p><p> 1826 * See also <a href="http://sqlite.org/foreignkeys.html">SQLite Foreign Key Constraints</a> 1827 * for more details about foreign key constraint support. 1828 * </p> 1829 * 1830 * @param enable True to enable foreign key constraints, false to disable them. 1831 * 1832 * @throws IllegalStateException if the are transactions is in progress 1833 * when this method is called. 1834 */ setForeignKeyConstraintsEnabled(boolean enable)1835 public void setForeignKeyConstraintsEnabled(boolean enable) { 1836 synchronized (mLock) { 1837 throwIfNotOpenLocked(); 1838 1839 if (mConfigurationLocked.foreignKeyConstraintsEnabled == enable) { 1840 return; 1841 } 1842 1843 mConfigurationLocked.foreignKeyConstraintsEnabled = enable; 1844 try { 1845 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 1846 } catch (RuntimeException ex) { 1847 mConfigurationLocked.foreignKeyConstraintsEnabled = !enable; 1848 throw ex; 1849 } 1850 } 1851 } 1852 1853 /** 1854 * This method enables parallel execution of queries from multiple threads on the 1855 * same database. It does this by opening multiple connections to the database 1856 * and using a different database connection for each query. The database 1857 * journal mode is also changed to enable writes to proceed concurrently with reads. 1858 * <p> 1859 * When write-ahead logging is not enabled (the default), it is not possible for 1860 * reads and writes to occur on the database at the same time. Before modifying the 1861 * database, the writer implicitly acquires an exclusive lock on the database which 1862 * prevents readers from accessing the database until the write is completed. 1863 * </p><p> 1864 * In contrast, when write-ahead logging is enabled (by calling this method), write 1865 * operations occur in a separate log file which allows reads to proceed concurrently. 1866 * While a write is in progress, readers on other threads will perceive the state 1867 * of the database as it was before the write began. When the write completes, readers 1868 * on other threads will then perceive the new state of the database. 1869 * </p><p> 1870 * It is a good idea to enable write-ahead logging whenever a database will be 1871 * concurrently accessed and modified by multiple threads at the same time. 1872 * However, write-ahead logging uses significantly more memory than ordinary 1873 * journaling because there are multiple connections to the same database. 1874 * So if a database will only be used by a single thread, or if optimizing 1875 * concurrency is not very important, then write-ahead logging should be disabled. 1876 * </p><p> 1877 * After calling this method, execution of queries in parallel is enabled as long as 1878 * the database remains open. To disable execution of queries in parallel, either 1879 * call {@link #disableWriteAheadLogging} or close the database and reopen it. 1880 * </p><p> 1881 * The maximum number of connections used to execute queries in parallel is 1882 * dependent upon the device memory and possibly other properties. 1883 * </p><p> 1884 * If a query is part of a transaction, then it is executed on the same database handle the 1885 * transaction was begun. 1886 * </p><p> 1887 * Writers should use {@link #beginTransactionNonExclusive()} or 1888 * {@link #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener)} 1889 * to start a transaction. Non-exclusive mode allows database file to be in readable 1890 * by other threads executing queries. 1891 * </p><p> 1892 * If the database has any attached databases, then execution of queries in parallel is NOT 1893 * possible. Likewise, write-ahead logging is not supported for read-only databases 1894 * or memory databases. In such cases, {@link #enableWriteAheadLogging} returns false. 1895 * </p><p> 1896 * The best way to enable write-ahead logging is to pass the 1897 * {@link #ENABLE_WRITE_AHEAD_LOGGING} flag to {@link #openDatabase}. This is 1898 * more efficient than calling {@link #enableWriteAheadLogging}. 1899 * <code><pre> 1900 * SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, 1901 * SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, 1902 * myDatabaseErrorHandler); 1903 * db.enableWriteAheadLogging(); 1904 * </pre></code> 1905 * </p><p> 1906 * Another way to enable write-ahead logging is to call {@link #enableWriteAheadLogging} 1907 * after opening the database. 1908 * <code><pre> 1909 * SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, 1910 * SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler); 1911 * db.enableWriteAheadLogging(); 1912 * </pre></code> 1913 * </p><p> 1914 * See also <a href="http://sqlite.org/wal.html">SQLite Write-Ahead Logging</a> for 1915 * more details about how write-ahead logging works. 1916 * </p> 1917 * 1918 * @return True if write-ahead logging is enabled. 1919 * 1920 * @throws IllegalStateException if there are transactions in progress at the 1921 * time this method is called. WAL mode can only be changed when there are no 1922 * transactions in progress. 1923 * 1924 * @see #ENABLE_WRITE_AHEAD_LOGGING 1925 * @see #disableWriteAheadLogging 1926 */ enableWriteAheadLogging()1927 public boolean enableWriteAheadLogging() { 1928 synchronized (mLock) { 1929 throwIfNotOpenLocked(); 1930 1931 if ((mConfigurationLocked.openFlags & ENABLE_WRITE_AHEAD_LOGGING) != 0) { 1932 return true; 1933 } 1934 1935 if (isReadOnlyLocked()) { 1936 // WAL doesn't make sense for readonly-databases. 1937 // TODO: True, but connection pooling does still make sense... 1938 return false; 1939 } 1940 1941 if (mConfigurationLocked.isInMemoryDb()) { 1942 Log.i(TAG, "can't enable WAL for memory databases."); 1943 return false; 1944 } 1945 1946 // make sure this database has NO attached databases because sqlite's write-ahead-logging 1947 // doesn't work for databases with attached databases 1948 if (mHasAttachedDbsLocked) { 1949 if (Log.isLoggable(TAG, Log.DEBUG)) { 1950 Log.d(TAG, "this database: " + mConfigurationLocked.label 1951 + " has attached databases. can't enable WAL."); 1952 } 1953 return false; 1954 } 1955 1956 mConfigurationLocked.openFlags |= ENABLE_WRITE_AHEAD_LOGGING; 1957 try { 1958 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 1959 } catch (RuntimeException ex) { 1960 mConfigurationLocked.openFlags &= ~ENABLE_WRITE_AHEAD_LOGGING; 1961 throw ex; 1962 } 1963 } 1964 return true; 1965 } 1966 1967 /** 1968 * This method disables the features enabled by {@link #enableWriteAheadLogging()}. 1969 * 1970 * @throws IllegalStateException if there are transactions in progress at the 1971 * time this method is called. WAL mode can only be changed when there are no 1972 * transactions in progress. 1973 * 1974 * @see #enableWriteAheadLogging 1975 */ disableWriteAheadLogging()1976 public void disableWriteAheadLogging() { 1977 synchronized (mLock) { 1978 throwIfNotOpenLocked(); 1979 1980 if ((mConfigurationLocked.openFlags & ENABLE_WRITE_AHEAD_LOGGING) == 0) { 1981 return; 1982 } 1983 1984 mConfigurationLocked.openFlags &= ~ENABLE_WRITE_AHEAD_LOGGING; 1985 try { 1986 mConnectionPoolLocked.reconfigure(mConfigurationLocked); 1987 } catch (RuntimeException ex) { 1988 mConfigurationLocked.openFlags |= ENABLE_WRITE_AHEAD_LOGGING; 1989 throw ex; 1990 } 1991 } 1992 } 1993 1994 /** 1995 * Returns true if write-ahead logging has been enabled for this database. 1996 * 1997 * @return True if write-ahead logging has been enabled for this database. 1998 * 1999 * @see #enableWriteAheadLogging 2000 * @see #ENABLE_WRITE_AHEAD_LOGGING 2001 */ isWriteAheadLoggingEnabled()2002 public boolean isWriteAheadLoggingEnabled() { 2003 synchronized (mLock) { 2004 throwIfNotOpenLocked(); 2005 2006 return (mConfigurationLocked.openFlags & ENABLE_WRITE_AHEAD_LOGGING) != 0; 2007 } 2008 } 2009 2010 /** 2011 * Collect statistics about all open databases in the current process. 2012 * Used by bug report. 2013 */ getDbStats()2014 static ArrayList<DbStats> getDbStats() { 2015 ArrayList<DbStats> dbStatsList = new ArrayList<DbStats>(); 2016 for (SQLiteDatabase db : getActiveDatabases()) { 2017 db.collectDbStats(dbStatsList); 2018 } 2019 return dbStatsList; 2020 } 2021 collectDbStats(ArrayList<DbStats> dbStatsList)2022 private void collectDbStats(ArrayList<DbStats> dbStatsList) { 2023 synchronized (mLock) { 2024 if (mConnectionPoolLocked != null) { 2025 mConnectionPoolLocked.collectDbStats(dbStatsList); 2026 } 2027 } 2028 } 2029 getActiveDatabases()2030 private static ArrayList<SQLiteDatabase> getActiveDatabases() { 2031 ArrayList<SQLiteDatabase> databases = new ArrayList<SQLiteDatabase>(); 2032 synchronized (sActiveDatabases) { 2033 databases.addAll(sActiveDatabases.keySet()); 2034 } 2035 return databases; 2036 } 2037 2038 /** 2039 * Dump detailed information about all open databases in the current process. 2040 * Used by bug report. 2041 */ dumpAll(Printer printer, boolean verbose)2042 static void dumpAll(Printer printer, boolean verbose) { 2043 for (SQLiteDatabase db : getActiveDatabases()) { 2044 db.dump(printer, verbose); 2045 } 2046 } 2047 dump(Printer printer, boolean verbose)2048 private void dump(Printer printer, boolean verbose) { 2049 synchronized (mLock) { 2050 if (mConnectionPoolLocked != null) { 2051 printer.println(""); 2052 mConnectionPoolLocked.dump(printer, verbose); 2053 } 2054 } 2055 } 2056 2057 /** 2058 * Returns list of full pathnames of all attached databases including the main database 2059 * by executing 'pragma database_list' on the database. 2060 * 2061 * @return ArrayList of pairs of (database name, database file path) or null if the database 2062 * is not open. 2063 */ getAttachedDbs()2064 public List<Pair<String, String>> getAttachedDbs() { 2065 ArrayList<Pair<String, String>> attachedDbs = new ArrayList<Pair<String, String>>(); 2066 synchronized (mLock) { 2067 if (mConnectionPoolLocked == null) { 2068 return null; // not open 2069 } 2070 2071 if (!mHasAttachedDbsLocked) { 2072 // No attached databases. 2073 // There is a small window where attached databases exist but this flag is not 2074 // set yet. This can occur when this thread is in a race condition with another 2075 // thread that is executing the SQL statement: "attach database <blah> as <foo>" 2076 // If this thread is NOT ok with such a race condition (and thus possibly not 2077 // receivethe entire list of attached databases), then the caller should ensure 2078 // that no thread is executing any SQL statements while a thread is calling this 2079 // method. Typically, this method is called when 'adb bugreport' is done or the 2080 // caller wants to collect stats on the database and all its attached databases. 2081 attachedDbs.add(new Pair<String, String>("main", mConfigurationLocked.path)); 2082 return attachedDbs; 2083 } 2084 2085 acquireReference(); 2086 } 2087 2088 try { 2089 // has attached databases. query sqlite to get the list of attached databases. 2090 Cursor c = null; 2091 try { 2092 c = rawQuery("pragma database_list;", null); 2093 while (c.moveToNext()) { 2094 // sqlite returns a row for each database in the returned list of databases. 2095 // in each row, 2096 // 1st column is the database name such as main, or the database 2097 // name specified on the "ATTACH" command 2098 // 2nd column is the database file path. 2099 attachedDbs.add(new Pair<String, String>(c.getString(1), c.getString(2))); 2100 } 2101 } finally { 2102 if (c != null) { 2103 c.close(); 2104 } 2105 } 2106 return attachedDbs; 2107 } finally { 2108 releaseReference(); 2109 } 2110 } 2111 2112 /** 2113 * Runs 'pragma integrity_check' on the given database (and all the attached databases) 2114 * and returns true if the given database (and all its attached databases) pass integrity_check, 2115 * false otherwise. 2116 *<p> 2117 * If the result is false, then this method logs the errors reported by the integrity_check 2118 * command execution. 2119 *<p> 2120 * Note that 'pragma integrity_check' on a database can take a long time. 2121 * 2122 * @return true if the given database (and all its attached databases) pass integrity_check, 2123 * false otherwise. 2124 */ isDatabaseIntegrityOk()2125 public boolean isDatabaseIntegrityOk() { 2126 acquireReference(); 2127 try { 2128 List<Pair<String, String>> attachedDbs = null; 2129 try { 2130 attachedDbs = getAttachedDbs(); 2131 if (attachedDbs == null) { 2132 throw new IllegalStateException("databaselist for: " + getPath() + " couldn't " + 2133 "be retrieved. probably because the database is closed"); 2134 } 2135 } catch (SQLiteException e) { 2136 // can't get attachedDb list. do integrity check on the main database 2137 attachedDbs = new ArrayList<Pair<String, String>>(); 2138 attachedDbs.add(new Pair<String, String>("main", getPath())); 2139 } 2140 2141 for (int i = 0; i < attachedDbs.size(); i++) { 2142 Pair<String, String> p = attachedDbs.get(i); 2143 SQLiteStatement prog = null; 2144 try { 2145 prog = compileStatement("PRAGMA " + p.first + ".integrity_check(1);"); 2146 String rslt = prog.simpleQueryForString(); 2147 if (!rslt.equalsIgnoreCase("ok")) { 2148 // integrity_checker failed on main or attached databases 2149 Log.e(TAG, "PRAGMA integrity_check on " + p.second + " returned: " + rslt); 2150 return false; 2151 } 2152 } finally { 2153 if (prog != null) prog.close(); 2154 } 2155 } 2156 } finally { 2157 releaseReference(); 2158 } 2159 return true; 2160 } 2161 2162 @Override toString()2163 public String toString() { 2164 return "SQLiteDatabase: " + getPath(); 2165 } 2166 throwIfNotOpenLocked()2167 private void throwIfNotOpenLocked() { 2168 if (mConnectionPoolLocked == null) { 2169 throw new IllegalStateException("The database '" + mConfigurationLocked.label 2170 + "' is not open."); 2171 } 2172 } 2173 2174 /** 2175 * Used to allow returning sub-classes of {@link Cursor} when calling query. 2176 */ 2177 public interface CursorFactory { 2178 /** 2179 * See {@link SQLiteCursor#SQLiteCursor(SQLiteCursorDriver, String, SQLiteQuery)}. 2180 */ newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query)2181 public Cursor newCursor(SQLiteDatabase db, 2182 SQLiteCursorDriver masterQuery, String editTable, 2183 SQLiteQuery query); 2184 } 2185 2186 /** 2187 * A callback interface for a custom sqlite3 function. 2188 * This can be used to create a function that can be called from 2189 * sqlite3 database triggers. 2190 * @hide 2191 */ 2192 public interface CustomFunction { callback(String[] args)2193 public void callback(String[] args); 2194 } 2195 } 2196