【发布时间】:2012-03-15 11:34:32
【问题描述】:
我必须从从 JSON API 获取的数据中创建一个 sqlite 数据库。代码运行良好,它通过 for 循环逐个添加它们,但 api 响应时间为每次命中 1 秒,因此 34000 秒加上通过代码将它们插入 sqlite 将需要大约 9 小时。有什么办法可以加快速度吗?
编辑:我正在使用 Objective C/sqlite3 框架/Xcode 4.2
这是代码...
dbPath=[self.databasePath UTF8String];
if(sqlite3_open(dbPath,&database)==SQLITE_OK)
{
// sqlite3_exec(database, "BEGIN", 0, 0, 0);
const char *sqlstatement="insert into artist values(?,?,?,?,?)";
sqlite3_stmt *compiledstatement;
if(sqlite3_prepare_v2(database,sqlstatement , -1, &compiledstatement, NULL)==SQLITE_OK)
{
for(i=4611;i<=34803;i++)
{
NSURLResponse *response;
NSError *err;
NSData *data= [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"API&id=%i",i]]] returningResponse:&response error:&err];
if(data.length>0)
{
NSError *err;
NSDictionary *jsonDict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];
// sqlite3_exec(database, "BEGIN", 0, 0, 0);
sqlite3_bind_text(compiledstatement,1,[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"id"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(compiledstatement,2,[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"name"] UTF8String], -1, SQLITE_TRANSIENT);
if([[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"description"])
sqlite3_bind_text(compiledstatement,3,[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"description"] UTF8String], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(compiledstatement,3,[@"" UTF8String], -1, SQLITE_TRANSIENT);
if([[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"links"]objectForKey:@"website"])
sqlite3_bind_text(compiledstatement,4,[[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"links"]objectForKey:@"website"] UTF8String], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(compiledstatement,4,[@"" UTF8String], -1, SQLITE_TRANSIENT);
if([[[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"media"]objectForKey:@"low_res_images"]objectAtIndex:0]objectForKey:@"url"])
sqlite3_bind_text(compiledstatement,5,[[[[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"media"]objectForKey:@"low_res_images"]objectAtIndex:0] objectForKey:@"url"] UTF8String], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(compiledstatement,5,[@"" UTF8String], -1, SQLITE_TRANSIENT);
if(sqlite3_step(compiledstatement)==SQLITE_DONE)
{
NSLog(@"done %i",i);
}
else NSLog(@"ERROR");
}
sqlite3_reset(compiledstatement);
}
}
}
else
NSLog(@"error");
sqlite3_close(database);
【问题讨论】:
-
34K 记录需要 9 小时?你做错了什么……
-
@MitchWheat 我已经发布了代码。请帮忙
-
这些记录经常变化吗?您可以在您的计算机上创建数据库并将其包含在项目中吗?
-
@JoshRagem 除了 objc 之外,还有什么更快的方法可以从 json API 填充这个 sqlite?
-
@Akash 我不知道,但是如果您获得的记录不经常更改,我认为您可以在桌面上填充 SQLite 数据库并将文件放入项目中,这样就可以了应用程序的一部分。然后,随着记录的变化,您可以通过应用程序逐步更新数据库。一个简单的“最后更新”日期戳足以让您用于检查更新。这看起来合理吗?
标签: iphone json performance sqlite insert