插入大约10000个数据需要大约60-70秒。我需要提交交易吗?

时间:2018-04-23 05:10:01

标签: ios swift sqlite sqlite.swift

我正在尝试将大约10000个数据插入到我的数据库中。检查下面的代码功能。插入所有数据大约需要一分钟。现在我已经在事务中添加了块,但是我需要提交它还是自动管理它。如何在下面的代码中编写它?

func insertDataToDB(objects: [DataModel]) {
        removeAllData()
        createSchemaForData()
        print("Start Inserting Connectors \(Date())")
        let stmt = try? db.prepare("INSERT INTO product (connectorId, deviceId, current, status, cost, voltage, power, type, method, mode) VALUES (?,?,?,?,?,?,?,?,?,?)")
        do {
            try db.transaction {
                for product in objects {
                    try stmt?.run(product.connectorId!, product.deviceId!, product.current, product.status, product.cost, product.voltage, product.power, product.type!, product.method!, product.mode)
                }
            }
        } catch {
            print("Failed Inserting connectors: \(error.localizedDescription)")
        }
        print("End Inserting Connectors \(Date())")
    }

removeAllData()在插入之前将从db中删除所有数据。

createSchemaForData()如果需要,将创建架构。

struct product {
    static let table = Table("product")
    static let connectorId = Expression<String>("connectorId")
    static let deviceId = Expression<String>("deviceId")
    static let current = Expression<Double?>("current")
    static let status = Expression<String?>("status")
    static let cost = Expression<Double?>("cost")
    static let voltage = Expression<Double?>("voltage")
    static let power = Expression<Double?>("power")
    static let type = Expression<String?>("type")
    static let method = Expression<String?>("method")
    static let mode = Expression<String?>("mode")
}

1 个答案:

答案 0 :(得分:0)

上面的代码没有问题,但我做错了是我创建的单例类。

我正在使用下面的连接,每次访问db对象时都会给我新的连接。

var db: Connection {
    let dbPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    return try! Connection("\(dbPath)/\(dbName)")
}

因此改进了代码,以便在详细信息中查看Rob的代码。所以现在插入数据的时间甚至不到一秒钟。

let db: Connection = {
        let path = NSSearchPathForDirectoriesInDomains(
            .documentDirectory, .userDomainMask, true
            ).first!
        return try! Connection("\(path)/EVDataBase.sqlite")
    }()

如果上面的代码仍有改进,请告诉我。或者,如果任何人都可以分享他们的单身人士或经理人课程也会有所帮助。