Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

SQLite Tutorial for iOS Development

Introduction to SQLite

SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. It is the most used database engine in the world. SQLite is built into all mobile phones and most computers and comes bundled inside countless other applications that people use every day.

Why Use SQLite in iOS Development?

SQLite is a popular choice for data storage in iOS applications because of its simplicity, lightweight nature, and full feature set. It is also serverless, self-contained, and requires no configuration, making it an ideal choice for mobile applications where resources are limited.

Setting Up SQLite in an iOS Project

To use SQLite in your iOS project, you need to add the SQLite library to your project. Follow these steps:

  1. Open your Xcode project.
  2. Go to the project settings and select your target.
  3. Click on the "Build Phases" tab.
  4. Expand the "Link Binary With Libraries" section.
  5. Click on the "+" button and add "libsqlite3.tbd".

Creating a Database

To create a database in SQLite, you need to use the following code:

let fileURL = try! FileManager.default
    .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    .appendingPathComponent("TestDatabase.sqlite")

if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
    print("There's an error in opening the database")
}

Creating a Table

To create a table in SQLite, you need to use the following code:

let createTableQuery = "CREATE TABLE IF NOT EXISTS Contacts (Id INT PRIMARY KEY NOT NULL, Name CHAR(255));"
if sqlite3_exec(db, createTableQuery, nil, nil, nil) != SQLITE_OK {
    let errmsg = String(cString: sqlite3_errmsg(db)!)
    print("error creating table: \(errmsg)")
}

Inserting Data

To insert data into a table in SQLite, you need to use the following code:

var statement: OpaquePointer?
let insertQuery = "INSERT INTO Contacts (Id, Name) VALUES (?, ?);"

if sqlite3_prepare_v2(db, insertQuery, -1, &statement, nil) == SQLITE_OK {
    sqlite3_bind_int(statement, 1, 1)
    sqlite3_bind_text(statement, 2, "John Doe", -1, nil)

    if sqlite3_step(statement) == SQLITE_DONE {
        print("Successfully inserted row.")
    } else {
        print("Could not insert row.")
    }
} else {
    print("INSERT statement could not be prepared.")
}

sqlite3_finalize(statement)

Reading Data

To read data from a table in SQLite, you need to use the following code:

let queryStatementString = "SELECT * FROM Contacts;"
var queryStatement: OpaquePointer?

if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
    while sqlite3_step(queryStatement) == SQLITE_ROW {
        let id = sqlite3_column_int(queryStatement, 0)
        let queryResultCol1 = sqlite3_column_text(queryStatement, 1)
        let name = String(cString: queryResultCol1!)

        print("Query Result:")
        print("\(id) | \(name)")
    }
} else {
    let errmsg = String(cString: sqlite3_errmsg(db)!)
    print("error preparing select: \(errmsg)")
}

sqlite3_finalize(queryStatement)

Updating Data

To update data in a table in SQLite, you need to use the following code:

let updateStatementString = "UPDATE Contacts SET Name = 'Jane Doe' WHERE Id = 1;"
var updateStatement: OpaquePointer?

if sqlite3_prepare_v2(db, updateStatementString, -1, &updateStatement, nil) == SQLITE_OK {
    if sqlite3_step(updateStatement) == SQLITE_DONE {
        print("Successfully updated row.")
    } else {
        print("Could not update row.")
    }
} else {
    print("UPDATE statement could not be prepared")
}

sqlite3_finalize(updateStatement)

Deleting Data

To delete data from a table in SQLite, you need to use the following code:

let deleteStatementString = "DELETE FROM Contacts WHERE Id = 1;"
var deleteStatement: OpaquePointer?

if sqlite3_prepare_v2(db, deleteStatementString, -1, &deleteStatement, nil) == SQLITE_OK {
    if sqlite3_step(deleteStatement) == SQLITE_DONE {
        print("Successfully deleted row.")
    } else {
        print("Could not delete row.")
    }
} else {
    print("DELETE statement could not be prepared")
}

sqlite3_finalize(deleteStatement)

Closing the Database

It is important to close the database connection when it is no longer needed. Use the following code to close the database:

sqlite3_close(db)

Conclusion

In this tutorial, we covered the basics of using SQLite in iOS development. We learned how to set up SQLite, create a database, create tables, insert data, read data, update data, delete data, and close the database. SQLite is a powerful and efficient choice for data storage in mobile applications, and mastering it will greatly enhance your iOS development skills.