使用Swift + FMDB打开和关闭数据库

时间:2015-05-12 17:33:04

标签: ios sqlite swift database-connection try-catch-finally

使用Swift + FMDB打开和关闭sqlite数据库连接的推荐方法是什么?

我正在关注此tutorial,这表明您应该打开和关闭数据库,如:

let db = FMDatabase(path: databasePath as String)
if db.open() {
    //do stuff
    db.close()

在finally块之外关闭数据库将是我用过的其他语言的红旗。我知道swift / iOS异常处理与大多数语言和开发环境不同。但是我仍然担心这仍然是关闭数据库连接的一种非常不安全的方式。

这种关闭数据库的方法实际上是否安全&建议?
我应该使用类似SwiftTryCatchFinally的东西吗?

let db = FMDatabase(path: databasePath as String)
SwiftTryCatch.try({
    connection = db.open()
    if connection {
        //do stuff
    }
}, catch: {

}, finally: {
    if connection {
        db.close()
    }
})

iOS异常处理对我来说太陌生了:P

1 个答案:

答案 0 :(得分:0)

这是我采取的方法,可能会给你一个见解。我在程序中有数据库调用,但表方法(创建,添加,更新)在一个类中,在需要时被多次调用。

所以要创建一个我调用的数据库,在这种情况下按下按钮时:

@IBAction func buttonCreateTable(sender: AnyObject) {
    var locationRecord: LocationRecord = LocationRecord()
    var isCreated = DatabaseFunctions.instance.createLocationTable()
    if isCreated {
        NSLog("Locations Database Created")
    } else {
        NSLog("Locations Database Not Created")
    }
}

类DatabaseFunctions.swift会读取...

import UIKit
let sharedInstance         = DatabaseFunctions()
class DatabaseFunctions: NSObject {
var database: FMDatabase? = nil

class var instance: DatabaseFunctions {
    sharedInstance.database = FMDatabase(path: Utilities.getPath("yourDatabase.sqlite"))
    var path = Utilities.getPath("yourDatabase.sqlite")
    return sharedInstance
}



// yourTableFunctions *************************
func createLocationTable() -> Bool {
    sharedInstance.database!.open()
    let sqlStatement = "CREATE TABLE IF NOT EXISTS MYTABLE (ID INTEGER PRIMARY KEY AUTOINCREMENT, TIMESTAMP DATETIME DEFAULT CURRENT_TIMESTAMP, TIMESTAMPLASTEDIT DATETIME DEFAULT CURRENT_TIMESTAMP, NAME TEXT, nil)"
    let isCreated = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray:nil)
    sharedInstance.database!.close()
    return isCreated
}

}

LocationsRecord在另一个swift,LocationInfo.swift中保持独立,文件如:

import UIKit

// Locations Class
class LocationRecord: NSObject {

var locationSelected : Int32         = Int32()
var locationRecordNo : Int32         = Int32()
var locationName: String             = String()

}