当前位置: 首页 > 面试题库 >

在Swift中访问SQLite数据库

屠钊
2023-03-14
问题内容

我正在寻找一种使用Swift代码在我的应用程序中访问SQLite数据库的方法。

我知道我可以在Objective
C中使用SQLite包装器并使用桥接头,但是我希望能够完全在Swift中完成此项目。如果可以的话,有没有办法做到这一点,有人可以将我指向一个引用,该引用显示了如何提交查询,检索行等。


问题答案:

虽然您可能应该使用许多SQLite包装器之一,但如果您想知道如何自己调用SQLite库,则可以:

  1. 配置您的Swift项目以处理SQLite C调用。如果使用Xcode 9或更高版本,则只需执行以下操作:

    import SQLite3
    
  2. 创建/打开数据库。

        let fileURL = try! FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("test.sqlite")

    // open database

    var db: OpaquePointer?
    guard sqlite3_open(fileURL.path, &db) == SQLITE_OK else {
        print("error opening database")
        sqlite3_close(db)
        db = nil
        return
    }

注意,我知道在打开失败后关闭数据库似乎很奇怪,但是sqlite3_open
文档明确指出我们必须这样做以避免内存泄漏:

无论错误是否在打开时发生,与数据库连接句柄关联的资源都应通过将其传递给sqlite3_close()不再需要时释放。

  1. 使用sqlite3_exec执行SQL(如创建表)。
        if sqlite3_exec(db, "create table if not exists test (id integer primary key autoincrement, name text)", nil, nil, nil) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error creating table: \(errmsg)")
    }
  1. 使用sqlite3_prepare_v2与准备SQL ?,这是我们将绑定值的占位符。
        var statement: OpaquePointer?

    if sqlite3_prepare_v2(db, "insert into test (name) values (?)", -1, &statement, nil) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing insert: \(errmsg)")
    }

    if sqlite3_bind_text(statement, 1, "foo", -1, SQLITE_TRANSIENT) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure binding foo: \(errmsg)")
    }

    if sqlite3_step(statement) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure inserting foo: \(errmsg)")
    }

注意,它使用可以如下实现的SQLITE_TRANSIENT常量:

        internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
    internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
  1. 重置SQL以插入另一个值。在此示例中,我将插入一个NULL值:
        if sqlite3_reset(statement) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error resetting prepared statement: \(errmsg)")
    }

    if sqlite3_bind_null(statement, 1) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure binding null: \(errmsg)")
    }

    if sqlite3_step(statement) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure inserting null: \(errmsg)")
    }
  1. 完成准备好的语句以恢复与该准备好的语句关联的内存:
        if sqlite3_finalize(statement) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error finalizing prepared statement: \(errmsg)")
    }

    statement = nil
  1. 准备用于从表中选择值的新语句,并通过检索值循环:
        if sqlite3_prepare_v2(db, "select id, name from test", -1, &statement, nil) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing select: \(errmsg)")
    }

    while sqlite3_step(statement) == SQLITE_ROW {
        let id = sqlite3_column_int64(statement, 0)
        print("id = \(id); ", terminator: "")

        if let cString = sqlite3_column_text(statement, 1) {
            let name = String(cString: cString)
            print("name = \(name)")
        } else {
            print("name not found")
        }
    }

    if sqlite3_finalize(statement) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error finalizing prepared statement: \(errmsg)")
    }

    statement = nil
  1. 关闭数据库:
        if sqlite3_close(db) != SQLITE_OK {
        print("error closing database")
    }

    db = nil


 类似资料:
  • 主要内容:本节引言:,1.SQLite事务,2.SQLite存储大二进制文件,3.SimpleCursorAdapter绑定数据库数据,4.数据库升级的一些集锦,本节小结:本节引言: 学习完上一节,关于Android中的SQLite的基本操作,你就已经掌握了,而在本节我们将会学习 一些稍微高级一点的东西,数据库事务,怎么将大二进制数据存储到数据库中,以及版本升级时 数据库如何处理!好的,开始本节内容! 1.SQLite事务 简单点说就是:写在事务里的所有数据库操作都成功,事务提交,否则,事务回滚

  • 主要内容:本节引言:,1.基本概念,2.使用SQLiteOpenHelper类创建数据库与版本管理,3.如何查看我们生成的db文件,4.使用Android提供的API操作SQLite,5.使用SQL语句操作数据库,本节小结:本节引言: 本节我们继续来学习Android数据存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同, 我们并不需要在手机上另外安装一个数据库软件,Android系统已经集成了这个数据库,我们无需像 使用其他数据库软件(Oracle,MSSQL,MySql等)

  • 问题内容: 我有一组HTML文件和一个SQLite数据库,我想使用file://方案从浏览器访问这些数据库。是否可以使用JavaScript访问数据库并创建查询(和表)? 问题答案: 不好的是,浏览器对它的支持非常有限。 这里更多信息HTML5索引,网络SQL数据库和浏览器大战 PS:正如@Christoph所说,WebSQL不再处于主动维护状态,并且Web应用程序工作组不打算进一步维护它,因此。

  • 问题内容: 我在SQLite中有一个完全填充的数据库,希望在新应用程序中使用。它相当大,因此,我希望尽可能避免将其更改为另一种格式。如何使用该数据库随我的应用一起提供的方式使用? 编辑:例如,如果我只是将文件拖放到“支持的文件”目录中,如何访问它?我该如何引用? 问题答案: 使用SQLite可以使SQLite数据库交互变得简单而干净。FMDB是SQLite C接口的Objective-C包装器。

  • 问题内容: C和派生函数的入口点函数具有和(和)参数,但是Swift没有合适的参数:顶级代码只是代码,并且没有参数。 在Swift程序中,如何访问等价的? 问题答案: 进程 刚刚重命名为 CommandLine (自Swift 3.0 8月4日快照以来) (由于某些原因,变更日志中未提及)

  • 问题内容: 我试图在Swift中访问temp目录。在Objective-C中,我可以使用以下代码进行操作: 但是,对于将类型从Objective-C转换为Swift 或从Swift转换为类型,我有些困惑 。我应该查看任何文件吗? 谢谢。 问题答案: 怎么样: 它没有回答您有关char *的问题,但它更干净… NSFileManager参考在这里。