1

我有一个 2 MB 的文件,不是太大,我想将它放入一个 sqlite 数据库中以便我可以搜索它。CSV 格式的条目大约有 30K,每行有六个字段。我的理解是 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 并将其加载到字典中?不幸的是,我需要搜索两个字段,我认为字典只能有一个键?


路易斯,谢谢你的回复。

我应该提到我只想在应用程序开始时将数据写入数据库一次,然后我只需要读取数据库,不写入。

您能告诉我如何在构建过程中直接从 CSV 文件生成 sqlite3 数据库吗?

4

3 回答 3

2

呃......不要自己处理C API。尤其是当有更好的包装器可用时: http ://cocoaheads.byu.edu/resources/sqlite

于 2009-09-30T05:21:17.870 回答
1

我认为您对 waht sqlite3 感到困惑。Sqlite3 不是内存数据库,它是基于持久磁盘的数据库,如果您每次做错事时都将所有数据加载到其中。SQLite 是为持久化而设计的,在你输入所有数据后,你可以关闭数据库,下次使用sqlite3_open_v2()打开它时,无需重新加载所有数据。默认情况下,sqlite3 以原子方式执行所有提交(这是插入速度慢的部分原因),因此您甚至在技术上都不需要关闭它(尽管您仍然应该关闭它,只是为了安全,或者如果您想尝试通过使用事务来提高性能)。

事实上,您可以从 CSV 文件生成 sqlite3 数据库作为构建过程的一部分,并将其包含在应用程序中,而不是在应用程序中包含 CSV 文件。

于 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 的方法?

于 2009-08-01T20:30:19.503 回答