【问题标题】:FMDB Data insertions timeFMDB 数据插入时间
【发布时间】:2018-04-06 01:26:16
【问题描述】:

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

我的问题是,有什么方法可以使这个过程成为一个并行过程,以便我可以同时将数据插入到不同的表中。如果没有,请您指导我正确的路径以实现更好的性能。 我也试过批量插入,但同时多次插入可能会导致db lock。

谢谢。

【问题讨论】:

    标签: ios iphone sqlite swift3 fmdb


    【解决方案1】:

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

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

    像这样的单例类

    导入基础 类 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

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2015-06-29
      • 2013-04-15
      • 2012-06-03
      • 2012-05-23
      相关资源
      最近更新 更多