Как повысить производительность вставки данных в SQLite Database.iOS - улучшенная производительность вставки SQLite
Объем данных 30000 записей. Кодекс:
- (void)insertBranchDB:branchlistArray
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
int count = 0;
for (Branch *branch in branchlistArray) {
NSString *insertSQL = [NSString stringWithFormat:
@"insert or replace into Branch (id, lang, lat, lng, province_id, district_id, optional, bus, status, name, address, contact, telephone, remark, province_name, district_name, lastupdate) values (\"%@\", \"%@\", \"%@\", \"%@\",\"%@\", \"%@\", \"%@\", \"%@\",\"%@\", \"%@\", \"%@\", \"%@\",\"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",branch._id,branch.lang,branch.lat,branch.lng,branch.province_id,branch.district_id,branch.optional,branch.bus,branch.status,branch.name,branch.address,branch.contact,branch.telephone,branch.remark,branch.province_name,branch.district_name,branch.lastupdate];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE) {
NSLog(@"Completed to Add Branch %d",count);
count;
}
else {
NSLog(@"Failed to Add Branch %d",count);
count;
}
}
sqlite3_finalize(statement);
sqlite3_close(database);
}
}
Вы можете переместить определение 'insertSQL' и присвоить' insert_stmt' вне цикла. Это означало бы использование заполнителей для значений («?») И заполнение их внутри цикла, используя семейство функций «sqlite3_bind_ *». – Avi
Точка Ави может иметь скромное влияние на производительность (существенная экономия при использовании транзакций), но вы должны принять его шаблон по другим причинам. В частности, использование '?' Placeholder в вашем SQL, а затем использование 'sqlite3_bind_xxx()' для привязки значений намного безопаснее и надежнее. Если кто-то попытался вставить значение, которое, собственно, содержало двойную кавычку, ваш существующий SQL не удался. Использование 'sqlite3_bind_xxx()' решит эту проблему. И, как говорит Ави, если вы «подготовитесь» один раз, а затем «привяжите», «шаг» и «перезагрузите» для каждого цикла, он также будет скромно более эффективным. – Rob
Кстати, если вы обнаружите, что вызов 'sqlite3_bind_xxx()' для каждого из этих столбцов немного громоздкий, вы можете использовать что-то вроде [FMDB] (https://github.com/ccgus/fmdb), что может упростить этот процесс. – Rob