SupportSQLiteDatabase

interface SupportSQLiteDatabase : Closeable


A database abstraction which removes the framework dependency and allows swapping underlying sql versions. It mimics the behavior of android.database.sqlite.SQLiteDatabase

Summary

Public functions

Unit

Begins a transaction in EXCLUSIVE mode.

Unit

Begins a transaction in IMMEDIATE mode.

Unit

Begins a transaction in EXCLUSIVE mode.

Unit

Begins a transaction in IMMEDIATE mode.

SupportSQLiteStatement

Compiles the given SQL statement.

Int
delete(table: String, whereClause: String?, whereArgs: Array<Any?>?)

Convenience method for deleting rows in the database.

Unit

This method disables the features enabled by enableWriteAheadLogging.

Boolean

This method enables parallel execution of queries from multiple threads on the same database.

Unit

End a transaction.

open Unit
execPerConnectionSQL(sql: String, bindArgs: Array<Any?>?)

Execute the given SQL statement on all connections to this database.

Unit

Execute a single SQL statement that does not return any data.

Unit
execSQL(sql: String, bindArgs: Array<Any?>)

Execute a single SQL statement that does not return any data.

Boolean

Returns true if the current thread has a transaction pending.

Long
insert(table: String, conflictAlgorithm: Int, values: ContentValues)

Convenience method for inserting a row into the database.

Boolean
needUpgrade(newVersion: Int)

Returns true if the new version code is greater than the current database version.

Cursor
query(query: String)

Runs the given query on the database.

Cursor

Runs the given query on the database.

Cursor
query(query: String, bindArgs: Array<Any?>)

Runs the given query on the database.

Cursor
@RequiresApi(api = 16)
query(query: SupportSQLiteQuery, cancellationSignal: CancellationSignal?)

Runs the given query on the database.

Unit

Sets whether foreign key constraints are enabled for the database.

Unit
setLocale(locale: Locale)

Sets the locale for this database.

Unit
setMaxSqlCacheSize(cacheSize: Int)

Sets the maximum size of the prepared-statement cache for this database.

Long
setMaximumSize(numBytes: Long)

Sets the maximum size the database will grow to.

Unit

Marks the current transaction as successful.

Int
update(
    table: String,
    conflictAlgorithm: Int,
    values: ContentValues,
    whereClause: String?,
    whereArgs: Array<Any?>?
)

Convenience method for updating rows in the database.

Boolean

Temporarily end the transaction to let other threads run.

Boolean
yieldIfContendedSafely(sleepAfterYieldDelayMillis: Long)

Temporarily end the transaction to let other threads run.

Public properties

List<Pair<StringString>>?

The list of full path names of all attached databases including the main database by executing 'pragma database_list' on the database.

Boolean

Is true if the given database (and all its attached databases) pass integrity_check, false otherwise.

Boolean

True if the current thread is holding an active connection to the database.

open Boolean

Is true if execPerConnectionSQL is supported by the implementation.

Boolean

Is true if the database is currently open.

Boolean

Is true if the database is opened as read only.

Boolean

Is true if write-ahead logging has been enabled for this database.

Long

The maximum size the database may grow to.

Long

The current database page size, in bytes.

String?

The path to the database file.

Int

The database version.

Extension functions

inline T
<T : Any?> SupportSQLiteDatabase.transaction(
    exclusive: Boolean,
    body: SupportSQLiteDatabase.() -> T
)

Run body in a transaction marking it as successful if it completes without exception.

Inherited functions

From java.io.Closeable

Public functions

beginTransaction

Added in 2.0.0
fun beginTransaction(): Unit

Begins a transaction in EXCLUSIVE mode.

Transactions can be nested. When the outer transaction is ended all of the work done in that transaction and all of the nested transactions will be committed or rolled back. The changes will be rolled back if any transaction is ended without being marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed.

Here is the standard idiom for transactions:

db.beginTransaction()
try {
...
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}

beginTransactionNonExclusive

Added in 2.0.0
fun beginTransactionNonExclusive(): Unit

Begins a transaction in IMMEDIATE mode. Transactions can be nested. When the outer transaction is ended all of the work done in that transaction and all of the nested transactions will be committed or rolled back. The changes will be rolled back if any transaction is ended without being marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed.

Here is the standard idiom for transactions:

db.beginTransactionNonExclusive()
try {
...
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}

beginTransactionWithListener

Added in 2.0.0
fun beginTransactionWithListener(
    transactionListener: SQLiteTransactionListener
): Unit

Begins a transaction in EXCLUSIVE mode.

Transactions can be nested. When the outer transaction is ended all of the work done in that transaction and all of the nested transactions will be committed or rolled back. The changes will be rolled back if any transaction is ended without being marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed.

Here is the standard idiom for transactions:

db.beginTransactionWithListener(listener)
try {
...
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}
Parameters
transactionListener: SQLiteTransactionListener

listener that should be notified when the transaction begins, commits, or is rolled back, either explicitly or by a call to yieldIfContendedSafely.

beginTransactionWithListenerNonExclusive

Added in 2.0.0
fun beginTransactionWithListenerNonExclusive(
    transactionListener: SQLiteTransactionListener
): Unit

Begins a transaction in IMMEDIATE mode. Transactions can be nested. When the outer transaction is ended all of the work done in that transaction and all of the nested transactions will be committed or rolled back. The changes will be rolled back if any transaction is ended without being marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed.

Here is the standard idiom for transactions:

db.beginTransactionWithListenerNonExclusive(listener)
try {
...
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}
Parameters
transactionListener: SQLiteTransactionListener

listener that should be notified when the transaction begins, commits, or is rolled back, either explicitly or by a call to yieldIfContendedSafely.

compileStatement

Added in 2.0.0
fun compileStatement(sql: String): SupportSQLiteStatement

Compiles the given SQL statement.

Parameters
sql: String

The sql query.

Returns
SupportSQLiteStatement

Compiled statement.

delete

Added in 2.0.0
fun delete(table: String, whereClause: String?, whereArgs: Array<Any?>?): Int

Convenience method for deleting rows in the database.

Parameters
table: String

the table to delete from

whereClause: String?

the optional WHERE clause to apply when deleting. Passing null will delete all rows.

whereArgs: Array<Any?>?

You may include ?s in the where clause, which will be replaced by the values from whereArgs. The values will be bound as Strings.

Returns
Int

the number of rows affected if a whereClause is passed in, 0 otherwise. To remove all rows and get a count pass "1" as the whereClause.

disableWriteAheadLogging

Added in 2.0.0
@RequiresApi(api = 16)
fun disableWriteAheadLogging(): Unit

This method disables the features enabled by enableWriteAheadLogging.

Throws
kotlin.IllegalStateException

if there are transactions in progress at the time this method is called. WAL mode can only be changed when there are no transactions in progress.

enableWriteAheadLogging

Added in 2.0.0
fun enableWriteAheadLogging(): Boolean

This method enables parallel execution of queries from multiple threads on the same database. It does this by opening multiple connections to the database and using a different database connection for each query. The database journal mode is also changed to enable writes to proceed concurrently with reads.

When write-ahead logging is not enabled (the default), it is not possible for reads and writes to occur on the database at the same time. Before modifying the database, the writer implicitly acquires an exclusive lock on the database which prevents readers from accessing the database until the write is completed.

In contrast, when write-ahead logging is enabled (by calling this method), write operations occur in a separate log file which allows reads to proceed concurrently. While a write is in progress, readers on other threads will perceive the state of the database as it was before the write began. When the write completes, readers on other threads will then perceive the new state of the database.

It is a good idea to enable write-ahead logging whenever a database will be concurrently accessed and modified by multiple threads at the same time. However, write-ahead logging uses significantly more memory than ordinary journaling because there are multiple connections to the same database. So if a database will only be used by a single thread, or if optimizing concurrency is not very important, then write-ahead logging should be disabled.

After calling this method, execution of queries in parallel is enabled as long as the database remains open. To disable execution of queries in parallel, either call disableWriteAheadLogging or close the database and reopen it.

The maximum number of connections used to execute queries in parallel is dependent upon the device memory and possibly other properties.

If a query is part of a transaction, then it is executed on the same database handle the transaction was begun.

Writers should use beginTransactionNonExclusive or beginTransactionWithListenerNonExclusive to start a transaction. Non-exclusive mode allows database file to be in readable by other threads executing queries.

If the database has any attached databases, then execution of queries in parallel is NOT possible. Likewise, write-ahead logging is not supported for read-only databases or memory databases. In such cases, enableWriteAheadLogging returns false.

The best way to enable write-ahead logging is to pass the android.database.sqlite.SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING flag to android.database.sqlite.SQLiteDatabase.openDatabase. This is more efficient than calling

SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler) db.enableWriteAheadLogging()

Another way to enable write-ahead logging is to call enableWriteAheadLogging after opening the database.

SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler) db.enableWriteAheadLogging()

See also SQLite Write-Ahead Logging for more details about how write-ahead logging works.

Returns
Boolean

True if write-ahead logging is enabled.

Throws
kotlin.IllegalStateException

if there are transactions in progress at the time this method is called. WAL mode can only be changed when there are no transactions in progress.

endTransaction

Added in 2.0.0
fun endTransaction(): Unit

End a transaction. See beginTransaction for notes about how to use this and when transactions are committed and rolled back.

execPerConnectionSQL

Added in 2.2.0
open fun execPerConnectionSQL(sql: String, bindArgs: Array<Any?>?): Unit

Execute the given SQL statement on all connections to this database.

This statement will be immediately executed on all existing connections, and will be automatically executed on all future connections.

Some example usages are changes like PRAGMA trusted_schema=OFF or functions like SELECT icu_load_collation(). If you execute these statements using execSQL then they will only apply to a single database connection; using this method will ensure that they are uniformly applied to all current and future connections.

An implementation of SupportSQLiteDatabase might not support this operation. Use isExecPerConnectionSQLSupported to check if this operation is supported before calling this method.

Parameters
sql: String

The SQL statement to be executed. Multiple statements separated by semicolons are not supported.

bindArgs: Array<Any?>?

The arguments that should be bound to the SQL statement.

Throws
kotlin.UnsupportedOperationException

if this operation is not supported. To check if it supported use isExecPerConnectionSQLSupported

execSQL

Added in 2.0.0
fun execSQL(sql: String): Unit

Execute a single SQL statement that does not return any data.

When using enableWriteAheadLogging, journal_mode is automatically managed by this class. So, do not set journal_mode using "PRAGMA journal_mode" statement if your app is using enableWriteAheadLogging

Parameters
sql: String

the SQL statement to be executed. Multiple statements separated by semicolons are not supported.

Throws
android.database.SQLException

if the SQL string is invalid

execSQL

Added in 2.0.0
fun execSQL(sql: String, bindArgs: Array<Any?>): Unit

Execute a single SQL statement that does not return any data.

When using enableWriteAheadLogging, journal_mode is automatically managed by this class. So, do not set journal_mode using "PRAGMA journal_mode" statement if your app is using enableWriteAheadLogging

Parameters
sql: String

the SQL statement to be executed. Multiple statements separated by semicolons are not supported.

bindArgs: Array<Any?>

only byte[], String, Long and Double are supported in selectionArgs.

Throws
android.database.SQLException

if the SQL string is invalid

inTransaction

Added in 2.0.0
fun inTransaction(): Boolean

Returns true if the current thread has a transaction pending.

Returns
Boolean

True if the current thread is in a transaction.

insert

Added in 2.0.0
fun insert(table: String, conflictAlgorithm: Int, values: ContentValues): Long

Convenience method for inserting a row into the database.

Parameters
table: String

the table to insert the row into

conflictAlgorithm: Int

for insert conflict resolver. One of android.database.sqlite.SQLiteDatabase.CONFLICT_NONE, android.database.sqlite.SQLiteDatabase.CONFLICT_ROLLBACK, android.database.sqlite.SQLiteDatabase.CONFLICT_ABORT, android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL, android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE, android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE.

values: ContentValues

this map contains the initial column values for the row. The keys should be the column names and the values the column values

Returns
Long

the row ID of the newly inserted row, or -1 if an error occurred

Throws
android.database.SQLException

If the insert fails

needUpgrade

Added in 2.0.0
fun needUpgrade(newVersion: Int): Boolean

Returns true if the new version code is greater than the current database version.

Parameters
newVersion: Int

The new version code.

Returns
Boolean

True if the new version code is greater than the current database version.

query

Added in 2.0.0
fun query(query: String): Cursor

Runs the given query on the database. If you would like to have typed bind arguments, use query.

Parameters
query: String

The SQL query that includes the query and can bind into a given compiled program.

Returns
Cursor

A Cursor object, which is positioned before the first entry. Note that Cursors are not synchronized, see the documentation for more details.

query

Added in 2.0.0
fun query(query: SupportSQLiteQuery): Cursor

Runs the given query on the database.

This class allows using type safe sql program bindings while running queries.

Parameters
query: SupportSQLiteQuery

The SimpleSQLiteQuery query that includes the query and can bind into a given compiled program.

Returns
Cursor

A Cursor object, which is positioned before the first entry. Note that Cursors are not synchronized, see the documentation for more details.

query

Added in 2.0.0
fun query(query: String, bindArgs: Array<Any?>): Cursor

Runs the given query on the database. If you would like to have bind arguments, use query.

Parameters
query: String

The SQL query that includes the query and can bind into a given compiled program.

bindArgs: Array<Any?>

The query arguments to bind.

Returns
Cursor

A Cursor object, which is positioned before the first entry. Note that Cursors are not synchronized, see the documentation for more details.

query

Added in 2.0.0
@RequiresApi(api = 16)
fun query(query: SupportSQLiteQuery, cancellationSignal: CancellationSignal?): Cursor

Runs the given query on the database.

This class allows using type safe sql program bindings while running queries.

Parameters
query: SupportSQLiteQuery

The SQL query that includes the query and can bind into a given compiled program.

cancellationSignal: CancellationSignal?

A signal to cancel the operation in progress, or null if none. If the operation is canceled, then androidx.core.os.OperationCanceledException will be thrown when the query is executed.

Returns
Cursor

A Cursor object, which is positioned before the first entry. Note that Cursors are not synchronized, see the documentation for more details.

setForeignKeyConstraintsEnabled

Added in 2.0.0
@RequiresApi(api = 16)
fun setForeignKeyConstraintsEnabled(enabled: Boolean): Unit

Sets whether foreign key constraints are enabled for the database.

By default, foreign key constraints are not enforced by the database. This method allows an application to enable foreign key constraints. It must be called each time the database is opened to ensure that foreign key constraints are enabled for the session.

A good time to call this method is right after calling #openOrCreateDatabase or in the SupportSQLiteOpenHelper.Callback.onConfigure callback.

When foreign key constraints are disabled, the database does not check whether changes to the database will violate foreign key constraints. Likewise, when foreign key constraints are disabled, the database will not execute cascade delete or update triggers. As a result, it is possible for the database state to become inconsistent. To perform a database integrity check, call isDatabaseIntegrityOk.

This method must not be called while a transaction is in progress.

See also SQLite Foreign Key Constraints for more details about foreign key constraint support.

Parameters
enabled: Boolean

True to enable foreign key constraints, false to disable them.

Throws
kotlin.IllegalStateException

if the are transactions is in progress when this method is called.

setLocale

Added in 2.0.0
fun setLocale(locale: Locale): Unit

Sets the locale for this database. Does nothing if this database has the android.database.sqlite.SQLiteDatabase.NO_LOCALIZED_COLLATORS flag set or was opened read only.

Parameters
locale: Locale

The new locale.

Throws
android.database.SQLException

if the locale could not be set. The most common reason for this is that there is no collator available for the locale you requested. In this case the database remains unchanged.

setMaxSqlCacheSize

Added in 2.0.0
fun setMaxSqlCacheSize(cacheSize: Int): Unit

Sets the maximum size of the prepared-statement cache for this database. (size of the cache = number of compiled-sql-statements stored in the cache).

Maximum cache size can ONLY be increased from its current size (default = 10). If this method is called with smaller size than the current maximum value, then IllegalStateException is thrown.

This method is thread-safe.

Parameters
cacheSize: Int

the size of the cache. can be (0 to android.database.sqlite.SQLiteDatabase.MAX_SQL_CACHE_SIZE)

setMaximumSize

Added in 2.0.0
fun setMaximumSize(numBytes: Long): Long

Sets the maximum size the database will grow to. The maximum size cannot be set below the current size.

Parameters
numBytes: Long

the maximum database size, in bytes

Returns
Long

the new maximum database size

setTransactionSuccessful

Added in 2.0.0
fun setTransactionSuccessful(): Unit

Marks the current transaction as successful. Do not do any more database work between calling this and calling endTransaction. Do as little non-database work as possible in that situation too. If any errors are encountered between this and endTransaction the transaction will still be committed.

Throws
kotlin.IllegalStateException

if the current thread is not in a transaction or the transaction is already marked as successful.

update

Added in 2.0.0
fun update(
    table: String,
    conflictAlgorithm: Int,
    values: ContentValues,
    whereClause: String?,
    whereArgs: Array<Any?>?
): Int

Convenience method for updating rows in the database.

Parameters
table: String

the table to update in

conflictAlgorithm: Int

for update conflict resolver. One of android.database.sqlite.SQLiteDatabase.CONFLICT_NONE, android.database.sqlite.SQLiteDatabase.CONFLICT_ROLLBACK, android.database.sqlite.SQLiteDatabase.CONFLICT_ABORT, android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL, android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE, android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE.

values: ContentValues

a map from column names to new column values. null is a valid value that will be translated to NULL.

whereClause: String?

the optional WHERE clause to apply when updating. Passing null will update all rows.

whereArgs: Array<Any?>?

You may include ?s in the where clause, which will be replaced by the values from whereArgs. The values will be bound as Strings.

Returns
Int

the number of rows affected

yieldIfContendedSafely

Added in 2.0.0
fun yieldIfContendedSafely(): Boolean

Temporarily end the transaction to let other threads run. The transaction is assumed to be successful so far. Do not call setTransactionSuccessful before calling this. When this returns a new transaction will have been created but not marked as successful. This assumes that there are no nested transactions (beginTransaction has only been called once) and will throw an exception if that is not the case.

Returns
Boolean

true if the transaction was yielded

yieldIfContendedSafely

Added in 2.0.0
fun yieldIfContendedSafely(sleepAfterYieldDelayMillis: Long): Boolean

Temporarily end the transaction to let other threads run. The transaction is assumed to be successful so far. Do not call setTransactionSuccessful before calling this. When this returns a new transaction will have been created but not marked as successful. This assumes that there are no nested transactions (beginTransaction has only been called once) and will throw an exception if that is not the case.

Parameters
sleepAfterYieldDelayMillis: Long

if 0, sleep this long before starting a new transaction if the lock was actually yielded. This will allow other background threads to make some more progress than they would if we started the transaction immediately.

Returns
Boolean

true if the transaction was yielded

Public properties

attachedDbs

Added in 2.0.0
val attachedDbsList<Pair<StringString>>?

The list of full path names of all attached databases including the main database by executing 'pragma database_list' on the database.

isDatabaseIntegrityOk

Added in 2.0.0
val isDatabaseIntegrityOkBoolean

Is true if the given database (and all its attached databases) pass integrity_check, false otherwise.

isDbLockedByCurrentThread

Added in 2.0.0
val isDbLockedByCurrentThreadBoolean

True if the current thread is holding an active connection to the database.

The name of this method comes from a time when having an active connection to the database meant that the thread was holding an actual lock on the database. Nowadays, there is no longer a true "database lock" although threads may block if they cannot acquire a database connection to perform a particular operation.

isExecPerConnectionSQLSupported

Added in 2.2.0
open val isExecPerConnectionSQLSupportedBoolean

Is true if execPerConnectionSQL is supported by the implementation.

isOpen

Added in 2.0.0
val isOpenBoolean

Is true if the database is currently open.

isReadOnly

Added in 2.0.0
val isReadOnlyBoolean

Is true if the database is opened as read only.

isWriteAheadLoggingEnabled

Added in 2.0.0
val isWriteAheadLoggingEnabledBoolean

Is true if write-ahead logging has been enabled for this database.

maximumSize

Added in 2.0.0
val maximumSizeLong

The maximum size the database may grow to.

pageSize

Added in 2.0.0
var pageSizeLong

The current database page size, in bytes.

The page size must be a power of two. This method does not work if any data has been written to the database file, and must be called right after the database has been created.

path

Added in 2.0.0
val pathString?

The path to the database file.

version

Added in 2.0.0
var versionInt

The database version.

Extension functions

transaction

inline fun <T : Any?> SupportSQLiteDatabase.transaction(
    exclusive: Boolean = true,
    body: SupportSQLiteDatabase.() -> T
): T

Run body in a transaction marking it as successful if it completes without exception.

Parameters
exclusive: Boolean = true

Run in EXCLUSIVE mode when true, IMMEDIATE mode otherwise.