Swift SQLite I / O错误

时间:2017-04-12 20:24:40

标签: ios swift sqlite io swift3

我一直收到以下错误:

  

致命错误:'尝试!'表达式意外地引发了一个错误:磁盘I / O.   错误(代码:10):文件   /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.63/src/swift/stdlib/public/core/ErrorType.swift,   第178行

当我实现以下代码时:

try db!.transaction() {
    hold = true
    for obj in object {
        if table.rawValue == DBTableNames.Products.rawValue {
            let product : ProductObject =  obj as! ProductObject
            insert = self.productsTable.insert(
                self.productcode <- product.productcode,
                self.admincost <- product.admincost,
                self.allocatedstock <- product.allocatedstock,
                self.availablestock <- product.availablestock,
                self.backorderstock <- product.backorderstock,
                self.barcode <- product.barcode,
                self.binno <- product.binno,
                self.casesperlayer <- product.casesperlayer,
                self.clearanceprice <- product.clearanceprice,
                self.exportprice <- product.exportprice,
                self.fulldescription <- product.fulldescription,
                self.gqcoded <- product.gqcoded,
                self.group <- product.group,
                self.innerbarcode <- product.innerbarcode,
                self.innerqty <- product.innerqty,
                self.lastPoDate <- product.lastPoDate as Date,
                self.layersperpallet <- product.layersperpallet,
                self.longdescription1 <- product.longdescription1,
                self.mtdsales <- product.mtdsales,
                self.onorderstock <- product.onorderstock,
                self.outerbarcode <- product.outerbarcode,
                self.packqty <- product.packqty,
                self.palletqty <- product.palletqty,
                self.physicalstock <- product.physicalstock,
                self.rollingsales <- product.rollingsales,
                self.rsp <- product.rsp,
                self.shortdescription <- product.shortdescription,
                self.threemonth <- product.threemonth,
                self.warehouse <- product.warehouse,
                self.weight <- product.weight,
                self.wholesaleprice <- product.wholesaleprice,
                self.ytdsales <- product.wholesaleprice)
        }
    }
    try self.db!.run(insert)
}

我理解它的I / O错误,但我不明白还有什么可以访问阻止插入的数据库

我使用以下fw:https://github.com/stephencelis/SQLite.swift

2 个答案:

答案 0 :(得分:0)

如果您在模拟器上收到错误,请阅读第2部分。如果在实际设备上发生错误,请尝试第1部分,还可以尝试在模拟器中运行您的应用并尝试我的答案的第2部分。

  1. 如果您使用的是实际设备并收到SQLite I / O错误: 错误的原因可能是数据库文件的位置。位置是:

    /var/mobile/Containers/Data/Application/someid/Documents/somedb.sqlite3

  2. 我通过将db文件移动到:

    来消除错误
    static var destinationSqliteURL: URL!
    let myPath = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
    destinationSqliteURL = myPath.appendingPathComponent("somedb.sqlite3")
    

    所以而不是:

    static var destinationSqliteURL: URL!
    let myPath = fileManager.urls(for: .libraryDirectory, in: .allDomainsMask)[0]
    destinationSqliteURL = myPath.appendingPathComponent("somedb.sqlite3")
    

    我用过:

    {{1}}
    1. 如果您正在使用模拟器并获得SQLite I / O错误:
    2. 你应该验证文件是否正常(使用xcode模拟器),打印出myPath并cd进入包含数据库的文件夹,然后在终端打开数据库文件:

      sqlite3 somedb.sqlite3

      可能没有文件或文件已损坏且必须更换。

答案 1 :(得分:0)

我有完全相同的问题。我的解决方案是从(单例)管理器类中删除数据库引用,并在下载新的数据库版本后重新初始化它。我的经理保留了旧数据库的参考。