2009-07-31 7 views
1

私はそれを検索できるように、私はsqliteデータベースに入れたいと思う大きすぎない2 MBのファイルを持っています。 CSV形式のエントリは約30,000件あり、1行に6つのフィールドがあります。私の理解は、iPhone上のsqliteがこのサイズのデータ​​ベースを扱うことができるということです。大きなファイルをObjective-CのiPhoneのsqliteテーブルに読み込みます

私はいくつかのアプローチを取ってきましたが、すべてが30秒を超えていませんでした。私は試しました:

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

2)ファイルを解析し、S​​QLiteのデータベースに直接にそれを置くために、次のObjective-Cのコードを使用する:

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に変換して辞書にロードする必要がありますか?残念ながら、2つのフィールドを検索する必要があります。辞書には1つのキーしかないと思いますか?


ルイ、ご返信ありがとうございます。

私は、アプリケーションの開始時に一度だけデータをデータベースに書き込んでおき、後でデータベースの読み込みを行う必要があると書いています。

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

答えて

1

OK、私はそれを持っていると思います。 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上で実行することです。 sqlite3にsqlファイルを読み込む1行のアプローチはありますか?

+1

ファイルをダンプしたくありません。これは、データベース自体を作成するのではなく、データベースを再作成するために使用できる一連の一連のSQL文を提供します。単にパスsqlite3を実行すると、 "sqlite3/path/to/my/db"というdbファイルが作成されます。そのファイルが人間が読めるものであれば、それはあなたが望むものではありません。 –

+0

ルイ、「sqlite3のパスを実行する」というコマンドを教えてもらえますか?おかげさまで –

+0

あなたが何かを意味してください: %sqlite3のnewdatabase.sqlite

1

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

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

関連する問題