对于我来说,最快的方式是在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字符串,然后立即完成所有操作。
(嗯,这表明了一些改进......我想我会继续问这个并在我了解更多时更新它。)
答案 0 :(得分:1)
我认为你最好使用NSFileHandle一次读取一个或几个日期文件行,然后随时插入表中。当然,你的记忆使用会更有效率。
更一般地说,您的数据应该与您的代码(尤其是您的SQL代码)分开。您的数据应采用某种原始分隔格式。一次读一行,然后调用SQL插入它。
如果这是一次性交易,您应该在桌面上创建SQL数据库,并将其包含在iPhone项目中。使用iPhone进行这种处理会给硬件带来很大的负担(至少比大多数iPhone用户所忍受的负担要多。)
如果你要经常使用SQL,你应该考虑使用Core Data。 Core Data在过程SQL和Objective-C之间提供了一个简单的接口。
答案 1 :(得分:1)
答案 2 :(得分:0)
是否可以只导入行然后在iPhone上存储sqlite数据库,如果数据总是相同的,没有理由在手机上执行此步骤,则可以避免一起插入。< / p>