FMDB数据插入时间

时间:2017-10-25 04:53:25

标签: ios iphone sqlite swift3 fmdb

在我的应用中,我在每张表中都有数千条记录。我有多个表插入。我正在使用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来保证线程安全,因为我在前两个类中插入数据,并且不希望出现任何数据库锁定问题。

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

感谢。

1 个答案:

答案 0 :(得分:0)

你可以保留你自己的单例类和方法来在表中插入数据应该返回bool值来知道数据是否被插入。

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

像这样的Singleton类

导入基金会 class 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

    }

}

从您的viewcontroller调用的方法

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