SQLite.swift - A type-safe, Swift-language layer over SQLite3.

Last update: Aug 3, 2022

SQLite.swift

Build Status CocoaPods Version Swift5 compatible Platform Carthage compatible Join the chat at https://gitter.im/stephencelis/SQLite.swift

A type-safe, Swift-language layer over SQLite3.

SQLite.swift provides compile-time confidence in SQL statement syntax and intent.

Features

  • A pure-Swift interface
  • A type-safe, optional-aware SQL expression builder
  • A flexible, chainable, lazy-executing query layer
  • Automatically-typed data access
  • A lightweight, uncomplicated query and parameter binding interface
  • Developer-friendly error handling and debugging
  • Full-text search support
  • Well-documented
  • Extensively tested
  • SQLCipher support via CocoaPods
  • Active support at StackOverflow, and Gitter Chat Room (experimental)

Usage

("id") let name = Expression("name") let email = Expression("email") try db.run(users.create { t in t.column(id, primaryKey: true) t.column(name) t.column(email, unique: true) }) // CREATE TABLE "users" ( // "id" INTEGER PRIMARY KEY NOT NULL, // "name" TEXT, // "email" TEXT NOT NULL UNIQUE // ) let insert = users.insert(name <- "Alice", email <- "[email protected]") let rowid = try db.run(insert) // INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]') for user in try db.prepare(users) { print("id: \(user[id]), name: \(user[name]), email: \(user[email])") // id: 1, name: Optional("Alice"), email: [email protected] } // SELECT * FROM "users" let alice = users.filter(id == rowid) try db.run(alice.update(email <- email.replace("mac.com", with: "me.com"))) // UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') // WHERE ("id" = 1) try db.run(alice.delete()) // DELETE FROM "users" WHERE ("id" = 1) try db.scalar(users.count) // 0 // SELECT count(*) FROM "users" ">
import SQLite

let db = try Connection("path/to/db.sqlite3")

let users = Table("users")
let id = Expression<Int64>("id")
let name = Expression<String?>("name")
let email = Expression<String>("email")

try db.run(users.create { t in
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email, unique: true)
})
// CREATE TABLE "users" (
//     "id" INTEGER PRIMARY KEY NOT NULL,
//     "name" TEXT,
//     "email" TEXT NOT NULL UNIQUE
// )

let insert = users.insert(name <- "Alice", email <- "[email protected]")
let rowid = try db.run(insert)
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')

for user in try db.prepare(users) {
    print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
    // id: 1, name: Optional("Alice"), email: [email protected]
}
// SELECT * FROM "users"

let alice = users.filter(id == rowid)

try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com')
// WHERE ("id" = 1)

try db.run(alice.delete())
// DELETE FROM "users" WHERE ("id" = 1)

try db.scalar(users.count) // 0
// SELECT count(*) FROM "users"

SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C API.

let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["[email protected]", "[email protected]"] {
    try stmt.run(email)
}

db.totalChanges    // 3
db.changes         // 1
db.lastInsertRowid // 3

for row in try db.prepare("SELECT id, email FROM users") {
    print("id: \(row[0]), email: \(row[1])")
    // id: Optional(2), email: Optional("[email protected]")
    // id: Optional(3), email: Optional("[email protected]")
}

try db.scalar("SELECT count(*) FROM users") // 2

Read the documentation or explore more, interactively, from the Xcode project’s playground.

SQLite.playground Screen Shot

For a more comprehensive example, see this article and the companion repository.

Installation

Note: Version 0.12 requires Swift 5 (and Xcode 10.2) or greater. Version 0.11.6 requires Swift 4.2 (and Xcode 10.1) or greater.

Carthage

Carthage is a simple, decentralized dependency manager for Cocoa. To install SQLite.swift with Carthage:

  1. Make sure Carthage is installed.

  2. Update your Cartfile to include the following:

    0.12.0 ">
    github "stephencelis/SQLite.swift" ~> 0.12.0
  3. Run carthage update and add the appropriate framework.

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. To install SQLite.swift with CocoaPods:

  1. Make sure CocoaPods is installed. (SQLite.swift requires version 1.6.1 or greater.)

    # Using the default Ruby install will require you to use sudo when
    # installing and updating gems.
    [sudo] gem install cocoapods
  2. Update your Podfile to include the following:

    use_frameworks!
    
    target 'YourAppTargetName' do
        pod 'SQLite.swift', '~> 0.12.0'
    end
  3. Run pod install --repo-update.

Swift Package Manager

The Swift Package Manager is a tool for managing the distribution of Swift code.

  1. Add the following to your Package.swift file:
dependencies: [
    .package(url: "https://github.com/stephencelis/SQLite.swift.git", from: "0.12.0")
]
  1. Build your project:
$ swift build

Manual

To install SQLite.swift as an Xcode sub-project:

  1. Drag the SQLite.xcodeproj file into your own project. (Submodule, clone, or download the project first.)

    Installation Screen Shot

  2. In your target’s General tab, click the + button under Linked Frameworks and Libraries.

  3. Select the appropriate SQLite.framework for your platform.

  4. Add.

Some additional steps are required to install the application on an actual device:

  1. In the General tab, click the + button under Embedded Binaries.

  2. Select the appropriate SQLite.framework for your platform.

  3. Add.

Communication

See the planning document for a roadmap and existing feature requests.

Read the contributing guidelines. The TL;DR (but please; R):

Author

License

SQLite.swift is available under the MIT license. See the LICENSE file for more information.

Related

These projects enhance or use SQLite.swift:

Alternatives

Looking for something else? Try another Swift wrapper (or FMDB):

GitHub

https://github.com/stephencelis/SQLite.swift
Comments
  • 1. CocoaPods fix: Xcode 7.3

    This should hopefully fix issues #349 #378 and includes work from #379.

    Please test on your platform and report if it works!

    pod "SQLite.swift",
      git: "https://github.com/stephencelis/SQLite.swift",
      branch: "cocoapods-xcode-7-3"
    

    Will merge when things look good!

    Reviewed by stephencelis at 2016-03-23 16:42
  • 2. performance issue iterating over a query

    I'm having big performance issue iterating over a query, this is my code:

    func getPdfWithCategory(language:Language) -> CategoriesForLanguage {
            let categoriesForLanguage = CategoriesForLanguage()
    
            let PDFs = pdfDb!.pdfsTb.table
            let categories = pdfDb!.categoriesTb.table
            start = NSDate()
            let query = PDFs.select(PDFs[*], categories[pdfDb!.categoriesTb.id], categories[pdfDb!.categoriesTb.name], categories[pdfDb!.categoriesTb.thumb], categories[pdfDb!.categoriesTb.orderid])
    .join(categories, on: categories[pdfDb!.categoriesTb.id] == PDFs[pdfDb!.pdfsTb.categoryId])
    .filter(PDFs[pdfDb!.pdfsTb.languageId] == language.id)
    
            let timeInterval:NSTimeInterval = start!.timeIntervalSinceNow
            println("query \(timeInterval)")
    
            println("query count = \(query.count)")
    
            start = NSDate()
            for row in query {
    
            }
    
            let timeInterval2:NSTimeInterval = start!.timeIntervalSinceNow
            println("for row in query \(timeInterval2)")
            return categoriesForLanguage
        }
    

    and this is the print results:

    query -0.0109010338783264 query count = 88 for row in query -2.39910697937012

    I have even removed the join to see if it was that:

    func getPdfWithCategory(language:Language) -> CategoriesForLanguage {
            let categoriesForLanguage = CategoriesForLanguage()
    
            let PDFs = pdfDb!.pdfsTb.table
            let categories = pdfDb!.categoriesTb.table
            start = NSDate()
            let query = PDFs.select(PDFs[*]).filter(PDFs[pdfDb!.pdfsTb.languageId] == language.id)
    
            let timeInterval:NSTimeInterval = start!.timeIntervalSinceNow
            println("query \(timeInterval)")
    
            println("query count = \(query.count)")
    
            start = NSDate()
            for row in query {
    
            }
    
            let timeInterval2:NSTimeInterval = start!.timeIntervalSinceNow
            println("for row in query \(timeInterval2)")
            return categoriesForLanguage
        }
    

    it improved a little bit, but still too long:

    query -0.00782698392868042 query count = 88 for row in query -1.40383696556091

    P.S. I'm testing on a iPad

    Reviewed by violabg at 2014-11-24 10:02
  • 3. Build fails with SQLCipher due to calls not yet available in SQLCipher

    commit 336faa1726887a90745e2949241394e41dd59be7 on Oct 8 added calls to sqlite3_expanded_sql and sqlite3_trace_v2.

    These are available in sqlite3 version 3.14, but not earlier versions. If you use SQLCipher upon which SQLiteCipher.swift is dependent, you get link errors because the version of sqlite3 used by SQLCipher is earlier than 3.14.

    Reviewed by jimt2000 at 2016-11-15 14:54
  • 4. Build failing with Xcode 7.3 beta

    My configuration is:

    • Using latest Xcode 7.3 beta (7D129n)

    • Using latest version of Cocoapods (0.39.0)

    • with Podfile:

      use_frameworks!
      
      target 'app' do
      
      pod 'SQLite.swift'
      
      end
      

    I tried with or without xcode-select -s [PATH_TO_XCODE_BETA] or xcode-select -s [PATH_TO_XCODE], but they both failed by following reason:

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/module.modulemap:1:8: error: redefinition of module 'Compression'
    module Compression [system] [extern_c] {
           ^
    /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/usr/include/module.modulemap:1:8: note: previously defined here
    module Compression [system] [extern_c] {
           ^
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/module.modulemap:6:8: error: redefinition of module 'Darwin'
    module Darwin [system] [extern_c] {
           ^
    /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/usr/include/module.modulemap:6:8: note: previously defined here
    module Darwin [system] [extern_c] {
           ^
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/module.modulemap:1478:8: error: redefinition of module 'os'
    module os [system] [extern_c] {
           ^
    /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/usr/include/module.modulemap:1599:8: note: previously defined here
    module os [system] [extern_c] {
           ^
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/module.modulemap:1494:8: error: redefinition of module 'libkern'
    module libkern [system] [extern_c] {
           ^
    /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/usr/include/module.modulemap:1615:8: note: previously defined here
    module libkern [system] [extern_c] {
           ^
    <unknown>:0: error: could not build Objective-C module 'SQLite'
    
    Reviewed by vhain at 2016-02-05 10:42
  • 5. Umbrella header SQLite.h not found in module.modulemap

    I've updated XCode to the new version and I am trying to convert everything to use Swift 2.0. Unfortunately SQLite does not work anymore. I used the newest cocoapods (ver. 0.38.2) and i use this podfile: use_frameworks! pod 'SQLite.swift',git: 'https://github.com/stephencelis/SQLite.swift.git',branch: 'swift-2' But I receive always the above mentioned error. I tried to clean the Build Folder without success, always the same. Using the old version of SQLite.swift (copying the project in my project) with the old version of xcode was running like a charm. Now I have troubles using SQLite.swift. thanks arnold

    Reviewed by arnoldschmid at 2015-09-23 18:41
  • 6. Support for CocoaPods

    Now that the current pre release version of CocoaPods supports Swift Frameworks I would like to ask if you could provide a podspec for Sqlite.swift.

    What do you think about this idea?

    Reviewed by skrach at 2015-01-19 12:00
  • 7. Version 0.11.6

    Per recent discussion, this bumps the version to 0.11.6 and updates the project to Swift 5.

    First time contributing, so please forgive anything I've missed in this.

    One change in Foundation.swift I'm not 100% sure about because it required force unwrapping pointer.baseAddress within withUnsafeBytes, but I wasn't able to find anything less invasive to the current implementation.

    Reviewed by sburlewapg at 2019-04-03 17:31
  • 8. Broken CocoaPods instructions on the Swift 2 branch

    add SQLite.swift to my swift 2 application as the document in readme :

    pod 'SQLite.swift',
    git: 'https://github.com/stephencelis/SQLite.swift.git'
    
    # instead, for SQLCipher support
    pod 'SQLiteCipher.swift',
    git: 'https://github.com/stephencelis/SQLite.swift.git'
    

    but CocoaPods print:

    [!] Unable to find a specification for 'SQLiteCipher.swift'.
    

    why ? how to use SQLite.swift in swift 2 Application?

    Reviewed by zixun at 2015-09-08 14:15
  • 9. Can't use it with Mac.app

    Hi,

    I tried your SQlite3 wrapper but was unable to get it to work with an Mac / Cocoa application. It would only work if the app was an iOS app to begin with. Could you tell what I am doing wrong? I added the framework just as depicted in your documentation. Regards Thomas bildschirmfoto 2015-01-17 um 17 06 53

    Reviewed by thomasschoenfeld at 2015-01-17 16:07
  • 10. Remove try! statement from FailableIterator

    My team has recently experienced crashes of an app in production related to SQLite.swift. Upon further review, we discovered that these crashes are occurring due to this try! encountering a throw from failableNext().

    This PR resolves the issue by returning nil if a throw is encountered.

    Here is the entire thread that crashes. Note that it occurs when using the Apollo-iOS framework, found here:

    Thread 7 name:
    Thread 7 Crashed:
    0   libswiftCore.dylib            	0x000000010117f968 0x100fa0000 + 1964392
    1   libswiftCore.dylib            	0x000000010117f968 0x100fa0000 + 1964392
    2   libswiftCore.dylib            	0x000000010102f994 0x100fa0000 + 588180
    3   SQLite                        	0x0000000100d7e80c _T06SQLite16FailableIteratorPAAE4next7ElementQzSgyFAA9StatementC_Tg5 + 212 (Statement.swift:211)
    4   SQLite                        	0x0000000100d674c8 _T06SQLite10ConnectionC7prepares11AnySequenceVyAA3RowVGAA9QueryType_pKFs0D8IteratorVyAHGycfU_AHSgycfU_TA + 76 (Query.swift:927)
    5   SQLite                        	0x0000000100d67578 _T06SQLite3RowVSgIxo_ADIxr_TRTA + 48 (Query.swift:0)
    6   libswiftCore.dylib            	0x000000010114e9bc 0x100fa0000 + 1763772
    7   libswiftCore.dylib            	0x000000010114e9fc 0x100fa0000 + 1763836
    8   libswiftCore.dylib            	0x000000010114ead0 0x100fa0000 + 1764048
    9   libswiftCore.dylib            	0x000000010102a8c8 0x100fa0000 + 567496
    10  libswiftCore.dylib            	0x000000010114e16c 0x100fa0000 + 1761644
    11  libswiftCore.dylib            	0x000000010118fd78 0x100fa0000 + 2030968
    12  libswiftCore.dylib            	0x0000000100fa8774 0x100fa0000 + 34676
    13  libswiftCore.dylib            	0x000000010115f5bc 0x100fa0000 + 1832380
    14  libswiftCore.dylib            	0x000000010114f4fc 0x100fa0000 + 1766652
    15  Apollo                        	0x0000000100a01c3c _T06Apollo21SQLiteNormalizedCacheC13selectRecords33_0382DE2BE0B0836588D3F2CA65C602E7LLSayAA6RecordVGSaySSG7forKeys_tKFTf4gn_n + 1284 (SQLiteNormalizedCache.swift:0)
    16  Apollo                        	0x0000000100a02710 _T06Apollo21SQLiteNormalizedCacheC12mergeRecords33_0382DE2BE0B0836588D3F2CA65C602E7LLs3SetVySSGAA06RecordO0V7records_tKFTf4gn_n + 116 (SQLiteNormalizedCache.swift:0)
    17  Apollo                        	0x0000000100a031c8 _T06Apollo21SQLiteNormalizedCacheC5mergeAA7PromiseCys3SetVySSGGAA06RecordG0V7records_tFTf4gn_n + 304 (SQLiteNormalizedCache.swift:0)
    18  Apollo                        	0x00000001009ff290 _T06Apollo21SQLiteNormalizedCacheCAA0cD0A2aDP5mergeAA7PromiseCys3SetVySSGGAA06RecordG0V7records_tFTW + 44 (SQLiteNormalizedCache.swift:0)
    19  Apollo                        	0x000000010099d1ec _T06Apollo0A5StoreC7publishAA7PromiseCyytGAA9RecordSetV7records_SvSg7contexttFyyyc_ys5Error_pctcfU_yycfU_Tf4ggng_n + 164 (ApolloStore.swift:52)
    20  Apollo                        	0x000000010099f788 _T06Apollo0A5StoreC7publishAA7PromiseCyytGAA9RecordSetV7records_SvSg7contexttFyyyc_ys5Error_pctcfU_yycfU_TA + 104 (ApolloStore.swift:0)
    21  Apollo                        	0x00000001009c0f1c _T0Ix_IyB_TR + 36 (GraphQLQueryWatcher.swift:0)
    22  libdispatch.dylib             	0x00000001812b2a54 _dispatch_call_block_and_release + 24 (init.c:994)
    23  libdispatch.dylib             	0x00000001812b2a14 _dispatch_client_callout + 16 (object.m:502)
    24  libdispatch.dylib             	0x00000001812c1540 _dispatch_queue_concurrent_drain + 540 (inline_internal.h:2500)
    25  libdispatch.dylib             	0x00000001812bd304 _dispatch_queue_invoke$VARIANT$mp + 348 (queue.c:5304)
    26  libdispatch.dylib             	0x00000001812bfcf4 _dispatch_root_queue_drain + 600 (inline_internal.h:2539)
    27  libdispatch.dylib             	0x00000001812bfa38 _dispatch_worker_thread3 + 120 (queue.c:6104)
    28  libsystem_pthread.dylib       	0x000000018155b06c _pthread_wqthread + 1268 (pthread.c:2286)
    29  libsystem_pthread.dylib       	0x000000018155ab6c start_wqthread + 4
    
    Reviewed by ethansinjin at 2018-03-08 20:51
  • 11. Xcode 12 Beta SQLite.swift Can't Build

    Issues are used to track bugs and feature requests. Need help or have a general question? Ask on Stack Overflow (tag sqlite.swift).

    Build Information

    • Include the SQLite.swift version, commit or branch experiencing the issue.
    • Mention Xcode and OS X versions affected.
    • How do do you integrate SQLite.swift in your project?
      • CocoaPods

    General guidelines

    • Be as descriptive as possible.
    • Provide as much information needed to reliably reproduce the issue.
    • Attach screenshots if possible.
    • Better yet: attach GIFs or link to video.
    • Even better: link to a sample project exhibiting the issue.

    image

    image

    Reviewed by RuoG at 2020-06-25 12:28
  • 12. Add combine support (change listener)

    Reactive database is needed in reactive architecture. I don't see any Combine bindings provided. Is there some sort of data change listener I could adapt myself to Combine?

    Reviewed by ursusursus at 2022-07-25 12:08
  • 13. Crash when extracting Date type data from DB

    Top Statement from crash logs static (extension in SQLite):Foundation.Date.fromDatatypeValue(Swift.String) -> Foundation.Date

    Build Information

    • version 0.13.3
    • Xcode used 13.2.1
    • Os version iOs 14+
    • How do do you integrate SQLite.swift in your project?
      • CocoaPods

    General guidelines

    • app Crashing for some user while extracting Date data from DB.
    • Start happening after upgrading to version 0.13.3 Screenshot 2022-06-01 at 6 24 04 PM
    Reviewed by ankitagg-ms at 2022-06-01 12:55
  • 14. WIP: Demo Codable Enum issue

    This is not the MR to merge in the current, but more like an issue with submitted demo test case.

    The problem: Codable Enum works fine only if saved via Encodable insert, but breaks if I insert column values directly. Compare:

    try db.run(table.insert(value)) //this one will read just fine
    // INSERT INTO "codable_camel_case" ("camelCaseString") VALUES ('"one"')
    try db.run(table.insert(column <- .one)) //this one produces runtime error upon decode
    // INSERT INTO "codable_camel_case" ("camelCaseString") VALUES ('one')
    

    I did implement conformance to Value protocol, as you can see in the code, but it seems fromDatatypeValue() function is never used. Instead, it seems to treat it as a JSON, but the second inserted value is of course no valid JSON

    Reviewed by ReDetection at 2022-04-14 15:21
  • 15. Error when using `decode` on a `pluck` result

    Issues are used to track bugs and feature requests. Need help or have a general question? Ask on Stack Overflow (tag sqlite.swift).

    Build Information

    SQLite.swift version: 0.13.2 (installed with Xcode "Add packages...") Xcode version: 13.2.1 macOS version: 12.3

    Description of issue

    When I try to decode a Codable type using db.prepare and iterating over the results, it works. However, when use db.pluck to fetch at most one of the same type, it fails with the error:

    DecodingError
      ▿ dataCorrupted : Context
        - codingPath : 0 elements
        - debugDescription : "decoding a single value container is not supported"
        - underlyingError : nil
    

    Playground code to reproduce the error above (I created as a new page in the SQLite.swift playground):

    import SQLite
    
    var db = try Connection(.inMemory)
    
    struct User: Codable {
      let name: String
    }
    
    let id = Expression<Int64>("id")
    let name = Expression<String>("name")
    
    let userTable = Table("user")
    try db.run(userTable.create() { tbl in
      tbl.column(id, primaryKey: true)
      tbl.column(name)
    })
    
    try db.run(userTable.insert(User(name: "User 1")))
    
    let results = try db.pluck(userTable)
    print(try results?.decode() as User?)
    

    Looking at the source code for the string in question, it seems like this is triggering the SQLiteDecoder.singleValueContainer method, and the error is being thrown intentionally, but this limitation isn't noted in the docs so it's possible I'm doing something wrong.

    Reviewed by tylerbrandt at 2022-03-21 18:19
  • 16. Crash - Statement.swift line 211

    After including SQLite in my project, I saw this crash:

    SQLite/Statement.swift:211: Fatal error: 'try!' expression unexpectedly raised an error: disk I/O error (code: 10)

    It looks like it's coming from here:

    extension FailableIterator {
        public func next() -> Element? {
            // swiftlint:disable:next force_try
            try! failableNext()
        }
    }
    

    #1028 mentions a fix was merged last year, but it looks like the code is still the same. Would you please check on it?

    Thanks very much!

    Reviewed by amandalragone at 2022-03-16 17:56
Related tags
🛶Shallows is a generic abstraction layer over lightweight data storage and persistence.

Shallows Shallows is a generic abstraction layer over lightweight data storage and persistence. It provides a Storage<Key, Value> type, instances of w

Aug 3, 2022
A lightweight wrapper over UserDefaults/NSUserDefaults with an additional layer of AES-256 encryption

SecureDefaults for iOS, macOS Requirements • Usage • Installation • Contributing • Acknowledgments • Contributing • Author • License SecureDefaults is

Jul 22, 2022
A protocol-centric, type and queue safe key-value workflow.
A protocol-centric, type and queue safe key-value workflow.

Light-weight, strict protocol-first styled PropertyKit helps you to easily and safely handle guaranteed values, keys or types on various situations of

Feb 26, 2021
YapDB is a collection/key/value store with a plugin architecture. It's built atop sqlite, for Swift & objective-c developers.
YapDB is a collection/key/value store with a plugin architecture. It's built atop sqlite, for Swift & objective-c developers.

YapDatabase is a collection/key/value store and so much more. It's built atop sqlite, for Swift & Objective-C developers, targeting macOS, iOS, tvOS &

Jul 26, 2022
A Swift wrapper for SQLite databases

Squeal, a Swift interface to SQLite Squeal provides access to SQLite databases in Swift. Its goal is to provide a simple and straight-forward base API

Aug 6, 2022
A stand-alone Swift wrapper around the SQLite 3 client library.
A stand-alone Swift wrapper around the SQLite 3 client library.

Perfect - SQLite Connector This project provides a Swift wrapper around the SQLite 3 library. This package builds with Swift Package Manager and is pa

Apr 4, 2022
A toolkit for SQLite databases, with a focus on application development
A toolkit for SQLite databases, with a focus on application development

A toolkit for SQLite databases, with a focus on application development

Aug 8, 2022
Realm is a mobile database: a replacement for Core Data & SQLite

Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository holds the source code for the iOS, macOS, tvOS & wa

Aug 6, 2022
A Cocoa / Objective-C wrapper around SQLite

FMDB v2.7 This is an Objective-C wrapper around SQLite. The FMDB Mailing List: https://groups.google.com/group/fmdb Read the SQLite FAQ: https://www.s

Aug 10, 2022
Implement Student Admission System using SQlite
Implement Student Admission System using SQlite

StudentAdmissionSQLiteApp Implement Student Admission System using SQlite. #Func

Apr 27, 2022
BucketServer - Small API with SQLite database that saves notes for an iOS appliction called Bucket list

BucketList Server-Side Small API with SQLite database that saves notes for an iO

Dec 30, 2021
macOS Sqlite tableView 샘플 - objective c

목적 Objective C언어를 이용하여 macOS를 개발해본다. Sqlite를 이용하여 데이터를 저장하고, 불러와본다. FMDB를 이용한다. 데이터를 NSTableView를 이용하여 불러와본다. 추가적으로 NSOutlineView 구현해본다. 추가적으로 KVOCont

Jan 10, 2022
MagicData - A replacement of SQlite, CoreData or Realm.

MagicData A replacement of SQlite, CoreData or Realm. It is very easy to use and is a light version. Guides MagicData We use MagicData manage all the

Jul 4, 2022
Nora is a Firebase abstraction layer for FirebaseDatabase and FirebaseStorage
Nora is a Firebase abstraction layer for FirebaseDatabase and FirebaseStorage

Nora is a Firebase abstraction layer for working with FirebaseDatabase and FirebaseStorage. Stop spending all that time cleaning up your view controll

Jul 29, 2022
A Swift wrapper for system shell over posix_spawn with search path and env support.

AuxiliaryExecute A Swift wrapper for system shell over posix_spawn with search path and env support. Usage import AuxiliaryExecute AuxiliaryExecute.l

Jul 28, 2022
Effortlessly synchronize UserDefaults over iCloud.
Effortlessly synchronize UserDefaults over iCloud.

Zephyr ??️ Effortlessly sync UserDefaults over iCloud About Zephyr synchronizes specific keys and/or all of your UserDefaults over iCloud using NSUbiq

Aug 5, 2022
💾 Safe, statically-typed, store-agnostic key-value storage written in Swift!

Storez ?? Safe, statically-typed, store-agnostic key-value storage Highlights Fully Customizable: Customize the persistence store, the KeyType class,

May 17, 2022
A functional tool-belt for Swift Language similar to Lo-Dash or Underscore.js in Javascript

Dollar Dollar is a Swift library that provides useful functional programming helper methods without extending any built in objects. It is similar to L

Aug 3, 2022
Safe and easy wrappers for common Firebase Realtime Database functions.

FirebaseHelper FirebaseHelper is a small wrapper over Firebase's realtime database, providing streamlined methods for get, set, delete, and increment

Apr 9, 2022