1

大きすぎない 2 MB のファイルがあり、それを検索できるように sqlite データベースに入れたいと考えています。CSV 形式のエントリは約 30K あり、1 行に 6 つのフィールドがあります。私の理解では、iPhone 上の sqlite はこのサイズのデータ​​ベースを処理できます。

私はいくつかのアプローチを取りましたが、それらはすべて 30 秒を超える遅さでした。私はもう試した:

1) C コードを使用してファイルを読み取り、フィールドを配列に解析します。

2) 次の Objective-C コードを使用してファイルを解析し、sqlite データベースに直接配置します。

NSString *file_text = [NSString stringWithContentsOfFile: filePath usedEncoding: NULL error: NULL];

NSArray  *lineArray = [file_text componentsSeparatedByString:@"\n"];

for(int k = 0; k < [lineArray count]; k++){
    NSArray *parts = [[lineArray objectAtIndex:k] componentsSeparatedByString: @","];

    NSString *field0       = [parts objectAtIndex:0];
    NSString *field2       = [parts objectAtIndex:2];
    NSString *field3       = [parts objectAtIndex:3];

NSString *loadSQLi = [[NSString alloc] initWithFormat: @"INSERT INTO TABLE (TABLE, FIELD0, FIELD2, FIELD3) VALUES ('%@', '%@', '%@');",field0, field2, field3];


    if (sqlite3_exec (db_table, [loadSQLi  UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(db_table);
        NSAssert1(0, @"Error loading table: %s", errorMsg);
    }

何か不足していますか?ファイルをデータベースにすばやく入れる方法を知っている人はいますか?

または、ファイルを sqlite に直接読み込むことができる sqlite 形式に変換することは可能ですか?

または、ファイルを plist に変換して Dictionary にロードする必要がありますか? 残念ながら、2 つのフィールドを検索する必要がありますが、Dictionary は 1 つのキーしか持てないと思いますか?


ルイス、あなたの応答に感謝します。

アプリの開始時に 1 回だけデータベースにデータを書き込みたいと述べたはずです。その後、データベースの読み取りのみを行う必要があり、書き込みは必要ありません。

ビルド プロセスの一環として、CSV ファイルから直接 sqlite3 データベースを生成する方法を教えてください。

4

3 に答える 3

2

うーん... C APIを自分で扱わないでください。特に、より優れたラッパーが利用可能な場合はそうではありません: http://cocoaheads.byu.edu/resources/sqlite

于 2009-09-30T05:21:17.870 に答える
1

sqlite3が何であるかについて混乱していると思います。Sqlite3 はメモリ内データベースではなく、何か間違ったことをするたびにすべてのデータをロードしている場合、永続ディスク ベースのデータベースです。SQLite は永続性を考慮して設計されています。すべてのデータを入力した後、db を閉じるだけで済みます。次にsqlite3_open_v2()を使用して開くときは、すべてのデータをリロードする必要はありません。デフォルトでは、sqlite3 はすべてのコミットをアトミックに実行するため (これが挿入が遅い理由の一部です)、技術的に閉じる必要さえありません (ただし、安全を期すために、または試してみたい場合に備えて、閉じる必要があります)。トランザクションを使用してパフォーマンスを向上させます)。

実際、CSV ファイルをアプリに含めるのではなく、ビルド プロセスの一部として CSV ファイルから sqlite3 データベースを生成し、それをアプリに含めることができます。

于 2009-07-31T18:37:10.033 に答える
1

わかりました、私はそれを手に入れたと思います。Unix コマンド プロンプトから始めて、次のコマンドは CSV ファイルを読み取り、SQL ファイルを書き出します。

 % sqlite3
 sqlite3> .mode csv
 sqlite3>  create table NEWTABLE (ITEM_ID INTEGER PRIMARY KEY, FIELD0 TEXT, FIELD1 TEXT, FIELD2 TEXT, FIELD3 TEXT, FIELD4 TEXT, FIELD5 TEXT);
 sqlite3> .import csvfile.csv NEWTABLE
 sqlite3> .output csvfile.sql
 sqlite3> .dump NEWTABLE

私がまだ理解していない部分は、SQL ファイルを sqlite3 に読み込む簡単な方法があるかどうかです。私が現在行っているアプローチは、SQL ファイルの各行を読み取り、iPhone で実行することです。SQLファイルをsqlite3に読み込むための1行のアプローチはありますか?

于 2009-08-01T20:30:19.503 に答える