在swift中设置关系数据库(sqlite)的步骤

时间:2015-01-02 21:34:39

标签: ios xcode swift sqlite

我正在开发iOS应用程序,我想为它设置一个关系数据库。我读到SQLite是一个很好用的数据库。我在Swift中制作应用程序。我看了几个教程,但似乎我找到的所有教程都有ObjectiveManager中的DBManager类或库。因此,我需要db类的包装器。我不确定包装器是如何工作的以及我如何使用swift语法调用objective-c方法。

我想知道是否有人可以帮助澄清整个过程,从创建数据库文件并将其添加到您的xcode项目以使用具有快速语法的objective-c库来运行对数据库文件的查询。

另外,使用似乎更容易使用的核心数据是否值得呢?

4 个答案:

答案 0 :(得分:14)

Objective-C教程仍然或多或少相关,但显然不会带来特定于Swift的细节(目前,正如另一位评论者所推荐的那样,FMDB也不会)。我最后写了SQLite.swift来利用Swift的一些更有趣的方面(类型安全和泛型,选项):

https://github.com/stephencelis/SQLite.swift

SQLite.swift提供了编译时的安全性/置信度,并且不再需要大量的错误处理。语句和表达式是在Swift中构建的,因此不太可能出现运行时SQL语法错误。

See the documentation有关创建数据库文件及其存储位置的更多信息(根据您的需要):

https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#connecting-to-a-database

就核心数据而言,它(与此答案时的大多数Apple库一样)并没有利用Swift,但拥有丰富的遗产,可能是最佳选择,特别是对于较小的持久对象图。但是,如果您想要控制关系数据库,或者您计划存储经常更改的大型数据集,您可能会对Core Data(以及您需要获得的特定于域的知识)感到沮丧,

答案 1 :(得分:1)

我自己一步一步地按照techtopia的说明进行了很好的解释。

http://www.techotopia.com/index.php/Swift_iOS_8_Database_Implementation_using_SQLite

http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_8_Application_using_Swift_and_FMDB

它使用FMDB包装器。

创建数据库和表格

override func viewDidLoad() {
super.viewDidLoad()

let filemgr = NSFileManager.defaultManager()
let dirPaths =
NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
        .UserDomainMask, true)

let docsDir = dirPaths[0] as! String

databasePath = docsDir.stringByAppendingPathComponent(
                "contacts.db")

if !filemgr.fileExistsAtPath(databasePath as String) {

    let contactDB = FMDatabase(path: databasePath as String)

    if contactDB == nil {
        println("Error: \(contactDB.lastErrorMessage())")
    }

    if contactDB.open() {
        let sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)"
        if !contactDB.executeStatements(sql_stmt) {
            println("Error: \(contactDB.lastErrorMessage())")
        }
        contactDB.close()
    } else {
        println("Error: \(contactDB.lastErrorMessage())")
    }
}
}

上述方法中的代码执行以下任务:

- 标识应用程序的Documents目录并构造contacts.db数据库文件的路径。

- 创建NSFileManager实例,然后使用它来检测数据库文件是否已存在。

- 如果该文件尚不存在,则代码通过创建使用数据库文件路径初始化的FMDatabase实例来创建数据库。如果数据库创建成功,则通过调用新数据库实例的open方法打开它。

- 准备SQL语句以在数据库中创建contacts表,并通过调用数据库实例的FMDB executeStatements方法来执行它。

- 关闭数据库。

将数据保存到数据库

@IBAction func saveData(sender: AnyObject) {
let contactDB = FMDatabase(path: databasePath as String)

if contactDB.open() {

    let insertSQL = "INSERT INTO CONTACTS (name, address, phone) VALUES ('\(name.text)', '\(address.text)', '\(phone.text)')"

    let result = contactDB.executeUpdate(insertSQL, 
        withArgumentsInArray: nil)

    if !result {
        status.text = "Failed to add contact"
        println("Error: \(contactDB.lastErrorMessage())")
    } else {
        status.text = "Contact Added"
        name.text = ""
        address.text = ""
        phone.text = ""
    }
} else {
    println("Error: \(contactDB.lastErrorMessage())")
}
}

来自数据库的FETCH数据

@IBAction func findContact(sender: AnyObject) {
let contactDB = FMDatabase(path: databasePath as String)

if contactDB.open() {
    let querySQL = "SELECT address, phone FROM CONTACTS WHERE name = '\(name.text)'"

    let results:FMResultSet? = contactDB.executeQuery(querySQL,
     withArgumentsInArray: nil)

    if results?.next() == true {
        address.text = results?.stringForColumn("address")
        phone.text = results?.stringForColumn("phone")
        status.text = "Record Found"
    } else {
        status.text = "Record not found"
        address.text = ""
        phone.text = ""
    }
    contactDB.close()
} else {
    println("Error: \(contactDB.lastErrorMessage())")
}
}

答案 2 :(得分:0)

您可以使用this project中包含的sqlite包装器。它是用Objective-C编写的,但它可以很容易地在Swift中使用。

答案 3 :(得分:0)

Swift 3的另一个SQLite包装器:http://github.com/groue/GRDB.swift

它提供:

  • 对于着名的Objective-C FMDB(https://github.com/ccgus/fmdb

  • 的用户看起来很熟悉的API
  • 利用Swift标准库的低级SQLite API。

  • 适用于SQL过敏开发者的漂亮Swift查询界面

  • 支持SQLite WAL模式和并发数据库访问以获得额外性能

  • 一个记录类,它包装结果集,吃早餐的自定义SQL查询,提供持久性操作和更改跟踪。

  • Swift类型自由:选择适合您数据的Swift类型。需要时使用Int64,或坚持使用方便的Int。存储和读取NSDate或NSDateComponents。为离散数据类型声明Swift枚举。定义您自己的数据库可转换类型。

  • 数据库迁移

  • 速度:https://github.com/groue/GRDB.swift/wiki/Performance