插入sqlite数据库需要花费太多时间 – iOS
发布时间:2020-12-12 18:52:34 所属栏目:百科 来源:网络整理
导读:我有6000条电话簿记录我正在插入sqlite 它需要45秒,这是一个巨大的时间. 对于每个记录我只想要几个属性,如姓名,电子邮件,身份证,修改日期.所以至少需要一个for循环,因为它需要45秒. 我怎么能减少? 这是更新的代码(此代码在dispatch_async中运行) 我也检查了
我有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负载并使事情更快地发生.(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |