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

Related tags

swift sqlite
Overview

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
  • Works on Linux (with some limitations)
  • Active support at StackOverflow, and Gitter Chat Room (experimental)

Usage

import SQLite

// Wrap everything in a do...catch to handle errors
do {
    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"
} catch {
    print (error)
}

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

// Wrap everything in a do...catch to handle errors
do {
    // ...
    
    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
} catch {
    print (error)
}

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.11.6 and later requires Swift 5 (and Xcode 10.2) or greater. Version 0.11.5 requires Swift 4.2 (and Xcode 10.1) or greater.

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.13.0")
]
  1. Build your project:
$ swift build

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:

    github "stephencelis/SQLite.swift" ~> 0.13.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.13.0'
    end
  3. Run pod install --repo-update.

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):

Issues
  • CocoaPods fix: Xcode 7.3

    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!

    cocoapods 
    opened by stephencelis 97
  • performance issue iterating over a query

    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

    enhancement 
    opened by violabg 47
  • Build fails with SQLCipher due to calls not yet available in SQLCipher

    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.

    opened by jimt2000 43
  • Build failing with Xcode 7.3 beta

    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'
    
    cocoapods 
    opened by vhain 33
  • Umbrella header SQLite.h not found in module.modulemap

    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

    opened by arnoldschmid 30
  • Thread safety

    Thread safety

    Is SQLite.swift thread safe?

    enhancement 
    opened by alecthomas 27
  • Linux support?

    Linux support?

    Do we have plan for supporting Linux platform? Just like this https://github.com/Zewo/PostgreSQL

    enhancement 
    opened by honghaoz 24
  • Support for CocoaPods

    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?

    enhancement help wanted 
    opened by skrach 24
  • Broken CocoaPods instructions on the Swift 2 branch

    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?

    question 
    opened by zixun 23
  • Can't use it with Mac.app

    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

    invalid 
    opened by thomasschoenfeld 23
  • Value of type 'Connection' has no member 'key'

    Value of type 'Connection' has no member 'key'

    As title, what's wrong with my code.

    I use Carthage install github "stephencelis/SQLite.swift"

    xcode ver 12.5.1 sqlite ver 0.13.0

    截圖 2021-09-16 15 15 12

    I follow document usage 截圖 2021-09-16 15 35 48

    opened by Bruce9487 0
  • Can we create SqlCiphe?

    Can we create SqlCiphe?

    null

    opened by eternal-glory 0
  • SqlCipher support for Swift PM

    SqlCipher support for Swift PM

    null

    opened by kmitj 0
  • Added supported iOS version to the Package.swift

    Added supported iOS version to the Package.swift

    Currently the Package.swift lacks a definition of the supported iOS version. I'm not sure if there is a conflict with the #ifdef for the linux version of this package.

    opened by obrhoff 0
  • Add column aliasing

    Add column aliasing

    Allows Row objects to be created publicly. This makes it easy to convert statements prepared from raw SQL and run with Connection.run() into the same shape as Connection.prepare(anyTableObject)

    opened by adamwulf 8
  • Missing required module 'SQLiteObjc'

    Missing required module 'SQLiteObjc'

    Error description:

    1. I integrated SQLite.swift in the static library through Swift Package Manager, uncheck when Choose package products and targets is operated;
    2. Click + in Target -> Build Phases -> Dependencies to add SQLite dependencies;
    3. When import SQLite in Swift file, report this error Missing required module'SQLiteObjc'.

    Since I need to reference SQLite.swift in multiple static libraries, I cannot add it to Link Binary With Libraries, otherwise it will cause duplicate symbols error. I would like to ask how to use SQLite.swift in multiple static libraries, thank you very much!

    opened by muzipiao 0
  • Expose connection flags

    Expose connection flags

    I'm wondering why the Connection constructor doesn't let you pass flags. E.g., it seems important that I be able to pass the flag SQLITE_OPEN_FILEPROTECTION_NONE.

    (@crspybits, #1042)

    enhancement 
    opened by jberkel 0
  • Expose new schema alteration operations

    Expose new schema alteration operations

    These have been added in more recent versions:

    • RENAME COLUMN (3.25.0)
    • DROP COLUMN (3.35.0)

    (maybe more)

    enhancement 
    opened by jberkel 0
  • Custom functions broken on Linux

    Custom functions broken on Linux

    Caused by this bug in Swift:

    https://bugs.swift.org/browse/SR-4429

    Not much we can do at this point, except avoiding this construct.

    * thread #1, name = 'SQLite.swiftPac', stop reason = signal SIGSEGV: invalid address (fault address: 0x50)
      * frame #0: 0x00007ffff7e1945c libswiftCore.so`swift::MetadataCacheEntryBase<(anonymous namespace)::TupleCacheEntry, swift::TargetTupleTypeMetadata<swift::InProcess>::Element>::doInitialization(swift::ConcurrencyControl&, swift::MetadataCompletionQueueEntry*, swift::MetadataRequest) + 380
        frame #1: 0x00007ffff7e0ad4d libswiftCore.so`std::pair<(anonymous namespace)::TupleCacheEntry*, swift::MetadataResponse> swift::LockingConcurrentMap<(anonymous namespace)::TupleCacheEntry, (anonymous namespace)::TupleCacheStorage>::getOrInsert<(anonymous namespace)::TupleCacheEntry::Key, swift::MetadataRequest&, swift::TargetValueWitnessTable<swift::InProcess> const*&>((anonymous namespace)::TupleCacheEntry::Key, swift::MetadataRequest&, swift::TargetValueWitnessTable<swift::InProcess> const*&) + 3373
        frame #2: 0x00007ffff7e09c7a libswiftCore.so`swift_getTupleTypeMetadata + 250
        frame #3: 0x00007ffff7e270b9 libswiftCore.so`swift::Demangle::__runtime::TypeDecoder<(anonymous namespace)::DecodedMetadataBuilder>::decodeMangledType(swift::Demangle::__runtime::Node*) + 9945
        frame #4: 0x00007ffff7e25467 libswiftCore.so`swift::Demangle::__runtime::TypeDecoder<(anonymous namespace)::DecodedMetadataBuilder>::decodeMangledType(swift::Demangle::__runtime::Node*) + 2695
        frame #5: 0x00007ffff7e24115 libswiftCore.so`swift_getTypeByMangledNodeImpl(swift::MetadataRequest, swift::Demangle::__runtime::Demangler&, swift::Demangle::__runtime::Node*, void const* const*, std::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned int)>, std::function<swift::TargetWitnessTable<swift::InProcess> const* (swift::TargetMetadata<swift::InProcess> const*, unsigned int)>) + 437
        frame #6: 0x00007ffff7e23f10 libswiftCore.so`swift::swift_getTypeByMangledNode(swift::MetadataRequest, swift::Demangle::__runtime::Demangler&, swift::Demangle::__runtime::Node*, void const* const*, std::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned int)>, std::function<swift::TargetWitnessTable<swift::InProcess> const* (swift::TargetMetadata<swift::InProcess> const*, unsigned int)>) + 384
        frame #7: 0x00007ffff7e24636 libswiftCore.so`swift_getTypeByMangledNameImpl(swift::MetadataRequest, __swift::__runtime::llvm::StringRef, void const* const*, std::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned int)>, std::function<swift::TargetWitnessTable<swift::InProcess> const* (swift::TargetMetadata<swift::InProcess> const*, unsigned int)>) + 1046
        frame #8: 0x00007ffff7e21ec0 libswiftCore.so`swift::swift_getTypeByMangledName(swift::MetadataRequest, __swift::__runtime::llvm::StringRef, void const* const*, std::function<swift::TargetMetadata<swift::InProcess> const* (unsigned int, unsigned int)>, std::function<swift::TargetWitnessTable<swift::InProcess> const* (swift::TargetMetadata<swift::InProcess> const*, unsigned int)>) + 384
        frame #9: 0x00007ffff7e220fa libswiftCore.so`swift_getTypeByMangledNameInContext + 170
        frame #10: 0x000055555557a7dd SQLite.swiftPackageTests.xctest`__swift_instantiateConcreteTypeFromMangledName at <compiler-generated>:0
        frame #11: 0x000055555558214f SQLite.swiftPackageTests.xctest`Connection.createFunction(function="test", argumentCount=2, deterministic=true, block=0x00005555555b8a80 SQLite.swiftPackageTests.xctest`partial apply forwarder for closure #1 (Swift.Array<Swift.Optional<SQLite.Binding>>) -> Swift.Optional<SQLite.Binding> in SQLite.Connection.createFunction<A where A: SQLite.Value>(Swift.String, Swift.UInt, Swift.Bool, (Swift.Array<Swift.Optional<SQLite.Binding>>) -> Swift.Optional<A>) throws -> (Swift.Array<SQLite.Expressible>) -> SQLite.Expression<Swift.Optional<A>> at <compiler-generated>, self=0x0000555555a01050) at Connection.swift:643:35
        frame #12: 0x00005555555afb75 SQLite.swiftPackageTests.xctest`Connection.createFunction<Z>(function="test", argumentCount=2, deterministic=true, block=0x5555555b5100, self=0x0000555555a01050) at CustomFunctions.swift:154:9
        frame #13: 0x00005555555b4c3c SQLite.swiftPackageTests.xctest`Connection.createFunction<Z, A, B>(function="test", deterministic=true, block=0x555555645470, self=0x0000555555a01050) at CustomFunctions.swift:120:22
        frame #14: 0x0000555555644b6e SQLite.swiftPackageTests.xctest`CustomFunctionWithTwoArgsTests.testFunctionLeftResultOptional(self=0x0000555555867d20) at CustomFunctionsTests.swift:115:53
    
    bug swift bug linux 
    opened by jberkel 0
  • Add test plans, run tests with NSZombieEnabled

    Add test plans, run tests with NSZombieEnabled

        Restarting after unexpected exit, crash, or test timeout in CustomAggregationTests.testCustomStringAgg(); summary will include totals from previous launches.
    
    enhancement 
    opened by jberkel 1
Releases(0.13.0)
Owner
Stephen Celis
Working on @pointfreeco: https://www.pointfree.co/
Stephen Celis
Native MongoDB driver for Swift, written in Swift

Installation | Tutorial | Basic usage | About BSON | Codable | Community | How to help A fast, pure swift MongoDB driver based on Swift NIO built for

null 617 Sep 20, 2021
Sync Realm Database with CloudKit

IceCream helps you sync Realm Database with CloudKit. It works like magic! Features Realm Database Off-line First Thread Safety Reactive Programming O

Soledad 1.6k Sep 18, 2021
Unrealm is an extension on RealmCocoa, which enables Swift native types to be saved in Realm.

Unrealm enables you to easily store Swift native Classes, Structs and Enums into Realm . Stop inheriting from Object! Go for Protocol-Oriented program

Artur  Mkrtchyan 459 Sep 14, 2021
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

August 13.6k Sep 21, 2021
CoreData/Realm sweet wrapper written in Swift

What is SugarRecord? SugarRecord is a persistence wrapper designed to make working with persistence solutions like CoreData in a much easier way. Than

Modo 2.1k Aug 18, 2021
Mac Native Mongodb Client

System Requirements Mac OS X (10.8.x, 10.9.x, 10.10.x), intel 64bit based. Download HERE Or you can compile it yourself using Xcode Build Just build i

Jérôme Lebel 2.5k Sep 12, 2021
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

Realm 14.6k Sep 16, 2021
WCDB is a cross-platform database framework developed by WeChat.

WCDB 中文版本请参看这里 WCDB is an efficient, complete, easy-to-use mobile database framework used in the WeChat application. It's currently available on iOS,

Tencent 9.2k Sep 16, 2021
The easiest way to get started with PostgreSQL on the Mac

Postgres.app The easiest way to run PostgreSQL on your Mac Includes everything you need to get started with PostgreSQL Comes with a pretty GUI to star

Postgres.app 6k Sep 23, 2021
Official home of the DB Browser for SQLite (DB4S) project. Previously known as "SQLite Database Browser" and "Database Browser for SQLite". Website at:

DB Browser for SQLite What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files c

null 15.4k Sep 24, 2021
MySQL/MariaDB database management for macOS

Sequel Ace Sequel Ace is the "sequel" to longtime macOS tool Sequel Pro. Sequel Ace is a fast, easy-to-use Mac database management application for wor

Sequel-Ace 3.6k Sep 18, 2021
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 &

Yap Studios 3.3k Sep 14, 2021
A library that provides the ability to import/export Realm files from a variety of data container formats.

Realm Converter Realm Converter is an open source software utility framework to make it easier to get data both in and out of Realm. It has been built

Realm 204 Jul 28, 2021
Personal db information management system.

The Information Management System This tool is so simple that most people don't understand how to use it. TL;DR This is a personal database which stor

null 39 Sep 14, 2021
The easiest way to get started with MongoDB on the Mac

mongoDB.app The easiest way to get started with mongoDB on the Mac. Just download, drag to the applications folder, and double-click. Download Version

Giovanni Collazo 472 Sep 16, 2021