Build and Run

    Description — Build and run a starter app to validate your install of Couchbase Lite on Swift

    Quick Steps

    1. Create a new Swift project as outlined in Install

    2. Open the new project’s ViewController.swift module in Xcode

    3. Replace the boiler-plate code with the code shown in Example 1

    4. Build and run the 'app'
      You should see — Figure 1 — the document ID and property printed to the 'console log', indicating that a document was created successfully persisted to the database, updated and queried.

    getting started ios
    Figure 1. Example app output
    Example 1. Code snippet

    This snippet demonstrates how to run basic CRUD operations, a simple Query and optionally running bi-directional replications with Sync Gateway.

    //
    //  Getting-Started.swift
    //  code-snippets
    //
    //  Copyright © 2025 couchbase. All rights reserved.
    //
    
    import UIKit
    import CouchbaseLiteSwift
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
    
            try! getStartedWithReplication(replication: false)
    }
    
        func getStartedWithReplication (replication: Bool) throws {
            // Get the database (and create it if it doesn’t exist).
            let database = try Database(name: "mydb")
            let defaultCol = try database.defaultCollection()
    
            // Create a new document (i.e. a record) in the database.
            var mutableDoc = MutableDocument()
                .setFloat(2.0, forKey: "version")
                .setString("SDK", forKey: "type")
    
            // Save document to default collection.
            try defaultCol.save(document: mutableDoc)
            print("Created document id type \(mutableDoc.id)? with type = \(mutableDoc.string(forKey: "type")!)")
            
            // Update a document.
            mutableDoc = try defaultCol.document(id: mutableDoc.id)!.toMutable()
            mutableDoc.setString("Swift", forKey: "language")
            try defaultCol.save(document: mutableDoc)
            let document = try defaultCol.document(id: mutableDoc.id)
            assert(document!.string(forKey: "language") == "Swift",
                   "Updated document id \(document!.id), adding language \(document!.string(forKey: "language")!)")
    
            // Create a query to fetch documents of type SDK.
            print("Querying Documents of type=SDK")
            let query = QueryBuilder
                .select(SelectResult.all())
                .from(DataSource.collection(defaultCol))
                .where(Expression.property("type").equalTo(Expression.string("SDK")))
    
            // Run the query.
            do {
                let result = try query.execute()
                print("Number of rows :: \(result.allResults().count)")
            } catch {
                fatalError("Error running the query")
            }
    
            if replication {
                // Create replicators to push and pull changes to and from the cloud.
                let targetEndpoint = URLEndpoint(url: URL(string: "ws://localhost:4984/getting-started-db")!)
                
                // Create Collection configuration.
                let colConfig = CollectionConfiguration(collection: defaultCol)
                
                // Create replicator configuration with the target endpoint and collection configuration.
                var replConfig = ReplicatorConfiguration(collections: [colConfig], target: targetEndpoint)
                replConfig.replicatorType = .pushAndPull
                
                // Add authentication.
                replConfig.authenticator = BasicAuthenticator(username: "john", password: "pass")
                
                // Create replicator (make sure to add an instance or static variable named replicator)
                let replicator = Replicator(config: replConfig)
    
                // Listen to replicator change events.
                replicator.addChangeListener { (change) in
                    if let error = change.status.error as NSError? {
                        print("Error code :: \(error.code)")
                    }
                }
    
                // Start replication.
                replicator.start()
            } else {
                print("Not running replication")
            }
        }
    }