操作方法:在iphone上快速将行插入Sqlite

时间:2009-12-10 13:47:39

标签: iphone sqlite

对于我来说,最快的方式是在iphone上的新sqlite3表中插入26,000行?

我天真的实现是创建一个文件foo.sql,如下所示:

BEGIN TRANSACTION;
CREATE TABLE user_db.places (
place_id integer primary key, -- cornell id less the leading L
lat        real not null,
lng        real not null,
name       text not null,
country_code text not null,
admin1     text not null,
private    integer not null);

INSERT INTO "places" VALUES(1,50.650002,-114.566666,'Windy Point',0,'CA','AB',0);
....
26k rows more
....
COMMIT;

然后运行此代码:

sql = [[[NSString alloc] initWithContentsOfFile:candidatePath  
                                       encoding:NSUTF8StringEncoding 
                                          error:NULL] autorelease];
if (sqlite3_exec(database,[sql UTF8String],NULL,NULL,&errorMsg) != SQLITE_OK) {
NSAssert1(0, @"Error loading update file: %s", errorMsg);
}   

工作非常糟糕(35秒)可能是因为它将2.8 MB的文件读入NSString,然后将该字符串转换为UTF8字符串,然后立即完成所有操作。

(嗯,这表明了一些改进......我想我会继续问这个并在我了解更多时更新它。)

3 个答案:

答案 0 :(得分:1)

我认为你最好使用NSFileHandle一次读取一个或几个日期文件行,然后随时插入表中。当然,你的记忆使用会更有效率。

更一般地说,您的数据应该与您的代码(尤其是您的SQL代码)分开。您的数据应采用某种原始分隔格式。一次读一行,然后调用SQL插入它。

如果这是一次性交易,您应该在桌面上创建SQL数据库,并将其包含在iPhone项目中。使用iPhone进行这种处理会给硬件带来很大的负担(至少比大多数iPhone用户所忍受的负担要多。)

如果你要经常使用SQL,你应该考虑使用Core Data。 Core Data在过程SQL和Objective-C之间提供了一个简单的接口。

答案 1 :(得分:1)

使用事务和参数化查询时,

sqlite变得更快:Improve INSERT-per-second performance of SQLite?

答案 2 :(得分:0)

是否可以只导入行然后在iPhone上存储sqlite数据库,如果数据总是相同的,没有理由在手机上执行此步骤,则可以避免一起插入。< / p>