Build and Run

    +

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

    You may encounter a Target Integrity Error when building for iOS Simulator(or iOS) — see Dealing with Target Integrity Error

    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.

    //
    //  ViewController.swift
    //  threeBeta01prod
    //
    //  Created by Ian Bridge on 04/10/2021.
    //
    
    import UIKit
    import CouchbaseLiteSwift
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
    
            getStarted(testReplication: false)
    }
    
    
        func getStarted (testReplication: Bool) {
            // Get the database (and create it if it doesn’t exist).
            let database: Database
            do {
                database = try Database(name: "mydb")
            } catch {
                fatalError("Error opening database")
            }
    
            // Create a new document (i.e. a record) in the database.
            let mutableDoc = MutableDocument()
                .setFloat(2.0, forKey: "version")
                .setString("SDK", forKey: "type")
    
            // Save it to the database.
            do {
                try database.saveDocument(mutableDoc)
            } catch {
                fatalError("Error saving document")
            }
            print("Created document id type \(mutableDoc.id)? with type = \(mutableDoc.string(forKey: "type")!)")
    
    
            // Update a document.
            if let mutableDoc = database.document(withID: mutableDoc.id)?.toMutable() {
                mutableDoc.setString("Swift", forKey: "language")
                do {
                    try database.saveDocument(mutableDoc)
    
                    let document = database.document(withID: mutableDoc.id)!
                    // Log the document ID (generated by the database)
                    // and properties
                    print("Updated document id \(document.id), adding language \(document.string(forKey: "language")!)")
                } catch {
                    fatalError("Error updating document")
                }
            }
    
            // Create a query to fetch documents of type SDK.
            print("Querying Documents of type=SDK")
            let query = QueryBuilder
                .select(SelectResult.all())
                .from(DataSource.database(database))
                .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 testReplication {
                // Create replicators to push and pull changes to and from the cloud.
                let targetEndpoint = URLEndpoint(url: URL(string: "ws://localhost:4984/getting-started-db")!)
                var replConfig = ReplicatorConfiguration(database: database, 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 testing replication")
            }
        }
    }