FMDB を使用して iPhone に大量のデータを挿入する最良の方法を誰か説明できますか? beginTransaction コマンドを使用しているようです。正直なところ、これまたは setShouldCacheStatements が何をするのかわかりません。これまでに同僚が行ったコードをたどったところ、次のようになりました。
BOOL oldshouldcachestatements = _db.shouldCacheStatements;
[_db setShouldCacheStatements:YES];
[_db beginTransaction];
NSString *insertQuery = [[NSString alloc] initWithFormat:@"INSERT INTO %@ values(null, ?, ?, ?, ?, ?, ?, ?);", tableName];
[tableName release];
BOOL success;
bPtr += 2;
int *iPtr = (int *)bPtr;
int numRecords = *iPtr++;
for (NSInteger record = 0; record < numRecords; record++) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Some business logic to read the binary stream
NSNumber *freq = aFreq > 0 ? [NSNumber numberWithDouble:100 * aFreq / 32768]: [NSNumber numberWithDouble:-1.0];
// these fields were calculated in the business logic section
success = [_db executeUpdate:insertQuery,
cID,
[NSNumber numberWithInt:position],
[NSString stringWithFormat:@"%@%@", [self stringForTypeA:typeA], [self stringForTypeB:typeB]], // methods are switch statements that look up the decimal number and return a string
[NSString stringWithFormat:@"r%i", rID],
[self stringForOriginal:original],
[self stringForModified:modified],
freq];
[pool drain];
}
[outerPool drain];
[_db commit];
[_db setShouldCacheStatements:oldshouldcachestatements];
これが最速ですか?書き込みはsqliteの制限ですか?http://www.sqlite.org/faq.html#q19を見ましたが、この実装が fmdb で最適かどうか、または他にできることがあるかどうかわかりませんでした。他の同僚の何人かは、一括挿入とその最適化について言及していましたが、これが私の最初の sqlite 遭遇であるため、それが何を意味するのか正直わかりません。研究に行くことができる考えや方向性はありますか? ありがとう!