插入sqlite数据库需要花费太多时间 – iOS

前端之家收集整理的这篇文章主要介绍了插入sqlite数据库需要花费太多时间 – iOS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有6000条电话簿记录我正在插入sqlite
它需要45秒,这是一个巨大的时间.

对于每个记录我只想要几个属性,如姓名,电子邮件,身份证,修改日期.所以至少需要一个for循环,因为它需要45秒.
我怎么能减少?

这是更新的代码(此代码在dispatch_async中运行)

我也检查了类似的问题How to insert 40000 records fast into an sqlite database in an iPad解决方案说我要使用BEGIN&我已经使用但仍面临相同的END交易.

更新 – 根据建议的解决方案,我已经更新了我的代码,但仍需要45秒.请帮我.

sqlite3_exec(db.insertPerson,"BEGIN TRANSACTION",nil,nil)

    for record:ABRecordRef in contactList
    {


        contactNumber = ""
        email = ""
        fullName = ""


        if (ABRecordCopyValue(record,kABPersonPhoneProperty) != nil) && (ABRecordCopyValue(record,kABPersonFirstNameProperty) != nil)

        {

                firstName = (ABRecordCopyValue(record,kABPersonFirstNameProperty)?.takeRetainedValue() as? String)!

                let numbers:ABMultiValue = ABRecordCopyValue(record,kABPersonPhoneProperty).takeRetainedValue()

               if (ABMultiValueGetCount(numbers) > 0)
               {
                    contactNumber = (ABMultiValueCopyValueAtIndex(numbers,0)?.takeRetainedValue() as? String)!

               }


                let modificationNSDate = (ABRecordCopyValue(record,kABPersonModificationDateProperty)?.takeRetainedValue())! as! NSDate


                modificationDate = dateFormatter.stringFromDate(modificationNSDate)

                recordId = ABRecordGetRecordID(record)

               if (ABRecordCopyValue(record,kABPersonLastNameProperty) != nil)
               {

                   lastName = (ABRecordCopyValue(record,kABPersonLastNameProperty).takeRetainedValue()as? String)!

                }


                let emails: ABMultiValueRef = ABRecordCopyValue(record,kABPersonEmailProperty).takeRetainedValue()

                for (var i = 0; i < ABMultiValueGetCount(emails); i++)
                {
                    email = ABMultiValueCopyValueAtIndex(emails,i).takeRetainedValue() as! String

                }


        }


        fullName = "\(firstName) \(lastName)";
        lastName = "";


   db.insertIntoContact(contactName: fullName,contactNumber: contactNumber,contactEmail: email,recordid : recordId,modifieddate: modificationDate)

    }

    sqlite3_exec(db.insertPerson,"END TRANSACTION",nil)

这是insertIntoContact func.

func insertIntoContact(contactName contactName : String!,contactNumber : String!,contactEmail : String!,recordid:Int32!,modifieddate:String! ) -> Bool
   {
    sqlite3_bind_text(insertPerson,1,(contactName as NSString).UTF8String,-1,nil)
    sqlite3_bind_text(insertPerson,2,(contactNumber as NSString).UTF8String,3,(contactEmail as NSString).UTF8String,nil)
    sqlite3_bind_int(insertPerson,4,Int32(recordid))
    sqlite3_bind_text(insertPerson,5,(modifieddate as NSString).UTF8String,nil)
    return executeUpdate(sqlStatement: insertPerson)
}

更多细节

func executeUpdate(sqlStatement statement:COpaquePointer) -> Bool
    {
        let resultCode = executeStatement(sqlStatement: statement,success:Int(sqlITE_DONE))
        sqlite3_reset(statement)
        return resultCode
    }



func executeStatement(sqlStatement statement:COpaquePointer,success successConstant:Int) -> Bool
{
    let success = Int(sqlite3_step(statement))

    if success != successConstant
    {
        print("Statement \(successConstant) Failed with error \(success)")
        return false
    }

    return true
}

解决方法

您需要在开始迭代超过6000条记录之前使用BEGIN TRANSACTION,并在发出所有条目添加后再使用END TRANSACTION – 这样您将降低I / O负载并使事情更快地发生.

猜你在找的Sqlite相关文章