March 23, 2025
+ 12

Description — Couchbase Lite for Android — Kotlin support
Related Content — Databases | Documents | Indexing |

Introduction

Couchbase Lite Android 3.2.2 introduces full idiomatic support for Kotlin apps, out-of-the-box.

Kotlin developers can now build apps using common Kotlin Patterns, that integrate seamlessly with Couchbase Lite for Android and have full feature parity with the Java API; including some convenient Kotlin Extensions to get you started.

Key features include:

  • Nullability annotations

  • Named parameters

  • Kotlin Flows, for asynchronous event notifications

Java support and functionality continues for Android.

Kotlin Extensions

In addition to having full co-compatible access to the existing Java API, Kotlin developers can also access a number of Kotlin Extensions.

The Kotlin Extensions package includes:

  • Configuration Factories for the configuration of important Couchbase Lite objects such as Databases, Replicators and Listeners.

  • Change Flows that monitor key Couchbase Lite objects fpr change using Kotlin features such as, Co-routines and Flows.

See: Kotlin Extensions for extension API docs

Configuration Factories

Couchbase Lite provides a set of ConfigurationFactories and CommonConfigurationFactories, these allow use of named parameters to specify property settings.

This makes it simple to create variant configurations, by simply overriding named parameters:

Example of overriding configuration
kotlin
val listener8080 = URLEndpointListenerConfigurationFactory.newConfig( networkInterface = "en0", port = 8080 ) val listener8081 = listener8080.newConfig(port = 8081)

Database

Use DatabaseConfigurationFactory to create a DatabaseConfiguration object, overriding the receiver’s values with the passed parameters.

kotlin
database = Database("getting-started")

Replication

Use ReplicatorConfigurationFactory to create a ReplicatorConfiguration object, overriding the receiver’s values with the passed parameters.

kotlin
val replicator = Replicator( ReplicatorConfigurationFactory.newConfig( collections = mapOf(db.collections to null), target = URLEndpoint(URI("ws://localhost:4984/getting-started-db")), type = ReplicatorType.PUSH_AND_PULL, authenticator = BasicAuthenticator("sync-gateway", "password".toCharArray()) ) )

Use FullTextIndexConfigurationFactory to create a FullTextIndexConfiguration object, overriding the receiver’s values with the passed parameters.

kotlin
collection.createIndex( "overviewFTSIndex", FullTextIndexConfigurationFactory.newConfig("overview") )

Indexing

Use ValueIndexConfigurationFactory to create a ValueIndexConfiguration object, overriding the receiver’s values with the passed parameters.

kotlin
collection.createIndex( "TypeNameIndex", ValueIndexConfigurationFactory.newConfig("type", "name") )

Logs

Use LogFileConfigurationFactory to create a LogFileConfiguration object, overriding the receiver’s values with the passed parameters.

kotlin
Database.log.file.let { it.config = LogFileConfigurationFactory.newConfig( context.cacheDir.absolutePath, (1) maxSize = 10240, (2) maxRotateCount = 5, (3) usePlainText = false ) (4) it.level = LogLevel.INFO (5) }

Flows

These wrappers use Flowables to monitor for changes.

Database Change Flow

Use the databaseChangeFlow(Database,Executor) to monitor database change events.

kotlin
val updatedDocs = db.databaseChangeFlow() .map { it.documentIDs } .asLiveData()

Document Change Flow

Use documentChangeFlow(Database,String,Executor) to monitor changes to a document.

kotlin
val docModDate = db.documentChangeFlow("1001", null) .map { it.collection.getDocument(it.documentID)?.getString("lastModified") } .asLiveData()

Replicator Change Flow

Use replicatorChangeFlow(Replicator,Executor) to monitor replicator changes.

kotlin
val replState = repl.replicatorChangesFlow() .map { it.status.activityLevel } .asLiveData()

Document Replicator Change Flow

Use documentReplicationFlow(Replicator,Executor) to monitor document changes during replication.

kotlin
val replicatedDocs = repl.documentReplicationFlow(testSerialExecutor) .map { update -> update.documents } .onEach { listView.setUpdated(it) } .collect()

Query Change Flow

Use queryChangeFlow(Query,Executor) to monitor document changes during replication.

kotlin
fun watchQuery(query: Query): LiveData<List<Result>> { return query.queryChangeFlow() .mapNotNull { change -> val err = change.error if (err != null) { throw err } change.results?.allResults() } .asLiveData() }