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

Posted

技术标签:

【中文标题】无法使用 swift 3 在 FMDB 中执行更新【英文标题】:Unable to perform update in FMDB using swift 3 【发布时间】:2016-12-19 13:53:52 【问题描述】:

我在我的 cocoapod 中使用 FMDB 作为依赖项。插入、删除和选择操作工作正常,但我无法更新一行。

这是我的代码

数据库和表创建

let filemgr = FileManager.default
let dirPaths = filemgr.urls(for: .documentDirectory,
                            in: .userDomainMask)
let databasePath = dirPaths[0].appendingPathComponent("database.sqlite").path

defaults.set(String(databasePath), forKey: "databasePath")

let dbObj = FMDatabase(path: defaults.value(forKey: "databasePath") as! String)

if dbObj == nil 
    print("Error: \(dbObj?.lastErrorMessage())")


if (dbObj?.open())!

    let sql_stmt = "CREATE TABLE IF NOT EXISTS TABLE_TICKET (ID INTEGER PRIMARY KEY AUTOINCREMENT, TICKET_SUBJECT TEXT, TICKET_DESCRIPTION TEXT, DEPARTMENT_ID TEXT, PRIORITY_ID TEXT NOT NULL, TYPE_ID TEXT NOT NULL, TICKET_ATTACHMENT TEXT, STAFF_NAME TEXT NOT NULL, TICKET_NO TEXT NOT NULL, TICKET_ID TEXT NOT NULL, TICKET_STATUS TEXT NOT NULL,TICKET_OFFLINE_FLAG TEXT NOT NULL,TICKET_DATE TEXT NOT NULL, TICKET_UPDATE_TIME TEXT )"
    if !(dbObj?.executeStatements(sql_stmt))! 
        print("Error: \(dbObj?.lastErrorMessage())")
    
    dbObj?.close()

else

    print("Error: \(dbObj?.lastErrorMessage())")

更新操作

   if (dbObj?.open())!
   
        let updatedTime = String(describing: json["response"]["CurrentDateTime"])
        print(updatedTime)
        let deleteSQL = "UPDATE TABLE_TICKET SET ticket_update_time = '\(updatedTime)' WHERE ticket_id ='\(self.currentTicketID!)'"

        do       
              try dbObj?.executeUpdate("UPDATE TABLE_TICKET SET ticket_update_time=? WHERE ticket_id=?", withArgumentsIn: [updatedTime, self.currentTicketID!])  
           
           catch 
               print(error)
           
     else 
        print("Error: \(dbObj?.lastErrorMessage())")
    

在搜索此问题时,我发现必须将数据库复制到特定位置,这样它就不会是只读的。如果是这样,我是否将其存储在错误的位置?

注意:执行此代码时我没有收到任何错误。更新后的列具有空白值(插入为空白)。

【问题讨论】:

【参考方案1】:

只要您对备份到 iCloud 感到满意,该位置就可以:

使用此目录来存储用户生成的内容。该目录的内容可以通过文件共享提供给用户;因此,他的目录应该只包含您可能希望向用户公开的文件。 此目录的内容由 iTunes 和 iCloud 备份。

就更新而言,如果您能够插入,我认为您的数据库不是只读的。根据我的经验,我必须对下载的任何新数据库文件设置权限,如下所示:

let attributes: [String:AnyObject] = [FileAttributeKey.posixPermissions.rawValue: NSNumber(value: 0o777)]
                        let fileContents = self.fileManager.contents(atPath: tempURL.path)

                        let success = self.fileManager.createFile(atPath: preferredURL.path, contents: fileContents, attributes: attributes)

如果只有更新查询失败,我会仔细检查数据和查询。

【讨论】:

以上是关于无法使用 swift 3 在 FMDB 中执行更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift FMDB 中使用 executeQuery() 执行基于条件的查询

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

快速使用 FMDB - 返回布尔值

iOS FMDB 无法更新二进制数据的问题

FMDB - 无法从 Cocoa 修改数据库

使用 fmdb 无法更新 blob 类型数据