我有6000条电话簿记录我正在插入sqlite
它需要45秒,这是一个巨大的时间.
它需要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 }