データベースに挿入する必要のある行がたくさんあります。必要な情報でタブ区切りされた約50個の.txtファイルをダウンロードします。データを解析し、同じ方法でデータベースに挿入します。別のメソッドとして使用した場合、27インチiMacのシミュレータは、メモリが不足したためにクラッシュしました。メソッドは次のようになります。
- (BOOL)insertDataWithFileName:(NSString *)fileName {
NSLog(@"%s %@", __FUNCTION__, fileName);
if (_db == nil) {
return NO;
}
// Get the data from the file
NSData *data = [[NSData alloc] initWithContentsOfFile:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:fileName]];
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// Parse each line by newlines first
NSArray *lines = [responseString componentsSeparatedByString:@"\n"];
NSString *ID = [[fileName componentsSeparatedByString:@"."] objectAtIndex:0];
// Set up the database insert statement
NSString *tableName = @"Hardcodedtablename"; // remove after prototype
BOOL oldshouldcachestatements = _db.shouldCacheStatements;
[_db setShouldCacheStatements:YES];
[_db beginTransaction];
NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO %@ values(null, ?, ?, ?, ?, ?, ?, ?);", tableName];
BOOL success;
// Parse each line by tabs
for (NSString *line in lines) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *fields = [line componentsSeparatedByString:@"\t"];
// Need to check since some of the .txt files have an empty newline at the EOF.
if ([fields count] == NUM_VARIANT_FIELDS) {
NSNumber *loc = [NSNumber numberWithInteger:[[fields objectAtIndex:0] integerValue]];
NSString *carType = [fields objectAtIndex:1];
NSString *model = [fields objectAtIndex:2];
NSString *AA = [fields objectAtIndex:7];
NSString *BB = [fields objectAtIndex:8];
NSNumber *freq = [[fields objectAtIndex:11] isEqualToString:@""] ? [NSNumber numberWithDouble:-1.0] : [NSNumber numberWithDouble:[[fields objectAtIndex:11] doubleValue]];
NSArray *argArray = [[NSArray alloc] initWithObjects:ID, loc, carType, model, AA, BB, freq, nil];
success = [_db executeUpdate:insertQuery withArgumentsInArray:argArray];
[argArray release];
}
[pool drain];
}
[_patientAnnotatedDatabase commit];
[_patientAnnotatedDatabase setShouldCacheStatements:oldshouldcachestatements];
return success;
}
forループからわかるように、配列が\ tで区切られた後は、実際には配列内のすべてのファイルは必要ありません。forループのメモリフットプリントを減らすために自動解放プールを設定しました。最大のファイルには270,000行が含まれています。これらのファイルは約50個あります。そのため、デバイスに2つのファイルを保存すると、クラッシュします。ただし、エラーメッセージはありません。
この時点で自分の選択肢は何だったのだろうと思っていました。iPadは実際にその量のデータを処理できますか?この方法を最適化できますか?
または、サーバー側でデータベースを作成し、代わりにデータベースをデバイスにダウンロードする必要がありますか?データベースをサーバーからデバイスにダウンロードした場合、FMDBは、これらのテーブルを1つのDBから別のDBに転送する機能をサポートしていますか?グーグルをしている間、そのようなものを見つけることができませんでした。ありがとう!