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

Posted

技术标签:

【中文标题】使用 Swift + FMDB 打开和关闭数据库【英文标题】:Open and close db with Swift + FMDB 【发布时间】:2015-07-23 17:38:01 【问题描述】:

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

我正在关注这个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

【问题讨论】:

你有没有想过这个问题?我有同样的问题。 没有。如果 db.open() /*do stuff*/ db.close() 我仍然会这样做 【参考方案1】:

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

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

@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()

【讨论】:

我不明白这与我的问题有何关系。如果您的创建、添加、更新等函数中的任何一个出现错误,数据库连接仍然不会关闭。 也许我看错了你。您必须正确的是 sharedInstance.database!.open()、sharedInstance.database!.close() 才能正常工作。这样,即使指令失败,表也已正确关闭。此示例在“if isCreated ...”中显示的内容如果失败,您会收到成功/错误消息。这样你就可以专注于代码,直到你做对了。正如我所说,如果我错过了这一点,请道歉并忽略。最好的。

以上是关于使用 Swift + FMDB 打开和关闭数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 swift 3 在 FMDB 中执行更新

FMDB的基本使用

如何将 FMDB 与 cocoapods 和 swift 一起使用?

如何在 swift 3 中使用现有的 SQLite? (FMDB)

Cocoapods、Swift 和 FMDB Cipher - 这三个目前兼容吗?

将 FMDB SQLite 结果附加到 Swift 数组