FMDB数据插入时间

FMDB Data insertions time

提问人:Vyshakh 提问时间:10/25/2017 更新时间:10/31/2017 访问量:254

问:

在我的应用程序中,每个表中有数千条记录。我插入了多个表。我正在使用 fmdb。为了插入数据,我使用 FMDatabaseQueue:

DBManager.GetQueue().inTransaction { (db, rollback) in
        var query: String = String()

        for obj in chatThreads
        {

            query += "insert or replace into \(TABLE_NAME) (\(COLUMN_THREAD_ID), \(COLUMN_CHAT_NAME), \(COLUMN_DATE_TIME)) values (\(obj.threadId), '\(obj.chat_name)', '\(obj.date_time)');"

        }

        if !(db.executeStatements(query)) {

        }
    }

我正在以上述方式将数据插入大约 15 个表。 现在的问题是,FMDatabaseQueue 一个接一个地插入数据,这是它应该的工作方式。我正在使用 FMDatabaseQueue 以确保线程安全,因为我在前两个类中插入数据,并且不希望出现任何数据库锁定问题。

我的问题是,有没有办法使这个过程成为一个并行过程,这样我就可以同时将数据插入到不同的表中。如果没有,您能否指导我走上正确的道路,以实现更好的性能。 我也尝试过批量插入,但同时多次插入可能会导致数据库锁定。

谢谢。

iOS的 iPhone SQLite SWIFT3 FMDB

评论


答:

0赞 Hasya 10/31/2017 #1

您可以保留自己的单例类和方法,以便在表中插入数据,如果返回 bool 值以了解数据是否已插入。

如果数据存储在表中,那么你可以触发另一种方法来插入数据,理想情况下,你可以制作链来存储表中的数据。

像这样的单例类

导入基金会 类 LocalDatabase: NSObject {

//sharedInstance
static let sharedInstance = LocalDatabase()



    func methodToCreateDatabase() -> NSURL? {

    let fileManager = NSFileManager.defaultManager()

    let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)

    if let documentDirectory:NSURL = urls.first { // No use of as? NSURL because let urls returns array of NSURL

        // exclude cloud backup
        do {
            try documentDirectory.setResourceValue(true, forKey: NSURLIsExcludedFromBackupKey)
        } catch _{
            print("Failed to exclude backup")
        }

        // This is where the database should be in the documents directory
        let finalDatabaseURL = documentDirectory.URLByAppendingPathComponent("contact.db")

        if finalDatabaseURL.checkResourceIsReachableAndReturnError(nil) {
            // The file already exists, so just return the URL
            return finalDatabaseURL
        } else {
            // Copy the initial file from the application bundle to the documents directory
            if let bundleURL = NSBundle.mainBundle().URLForResource("contact", withExtension: "db") {

                do {
                    try fileManager.copyItemAtURL(bundleURL, toURL: finalDatabaseURL)
                } catch _ {
                    print("Couldn't copy file to final location!")
                }

            } else {
                print("Couldn't find initial database in the bundle!")
            }
        }
    } else {
        print("Couldn't get documents directory!")
    }

    return nil
}

    func methodToInsertUpdateDeleteData(strQuery : String) -> Bool
    {

       // print("%@",String(methodToCreateDatabase()!.absoluteString))

        let contactDB = FMDatabase(path: String(methodToCreateDatabase()!.absoluteString) )

        if contactDB.open() {

            let insertSQL = strQuery

            let result = contactDB.executeUpdate(insertSQL,
                withArgumentsInArray: nil)

            if !result {
                print("Failed to add contact")
                print("Error: \(contactDB.lastErrorMessage())")
                return false
            } else {
                print("Contact Added")
                return true
            }
        } else {
            print("Error: \(contactDB.lastErrorMessage())")
            return false
        }

    }

    func methodToSelectData(strQuery : String) -> NSMutableArray
    {

        let arryToReturn : NSMutableArray = []

        print("%@",String(methodToCreateDatabase()!.absoluteString))

        let contactDB = FMDatabase(path: String(methodToCreateDatabase()!.absoluteString) )

        if contactDB.open() {
            let querySQL = strQuery

            let results:FMResultSet? = contactDB.executeQuery(querySQL,
                withArgumentsInArray: nil)

            while results?.next() == true
            {
                arryToReturn.addObject(results!.resultDictionary())
            }

            // NSLog("%@", arryToReturn)

            if arryToReturn.count == 0
            {
                print("Record Not Found")

            }
            else
            {
                print("Record Found")

            }


            contactDB.close()
        } else {
            print("Error: \(contactDB.lastErrorMessage())")
        }

        return arryToReturn

    }

}

以及像这样从视图控制器调用的方法

if LocalDatabase.sharedInstance.methodToInsertUpdateDeleteData("INSERT INTO CONTACTS_TABLE (name, address, phone) VALUES ('Demo1', 'Demo2', 123)")
{
    NSLog("Store Successfully.")
}
else
{
    NSLog("Failled to store in database.")
}

这是与FMDB连接的包装单例类

https://github.com/hasyapanchasara/SQLite_SingleManagerClass