我有一个简单的阅读应用程序,它使用fmdb与数据库通信,然后用文本填充UIWebview.自从ios 5的辉煌问世以来,它的运行非常糟糕……
当我通过segmentedControl tap更改我书中的章节时.在ios 4.3中,它速度非常快.现在,正如您在下面看到的那样,它不是:
所以显然事情是加载缓慢,但我不知道如何阅读速度测试的结果.哪种方法是罪魁祸首?我需要做些什么才能优化应用?还有什么我可以做的,以了解挂起的确切位置?
我在fmdb和ios 5上遇到了这么难,我正在考虑其他选择.我应该废弃fmdb吗?并采用直接的ios sqlite db方法?
我发现仪器工具很有用,但很难理解和使用.
UPDATE
这是更改章节方法:
- (IBAction) changeChapter:(id)sender {
if ([prevNext selectedSegmentIndex] == 0) {
//previous
[self setCurrentChapter:(currentChapter-1)];
} else {
//next
[self setCurrentChapter:(currentChapter+1)];
}
[self refreshUI];
}
更新2:
这是仪器告诉我的代码是问题.它是fmdb用于迭代FMResultSet的下一个方法:
- (BOOL) next {
int rc;
BOOL retry;
int numberOfRetries = 0;
do {
retry = NO;
rc = sqlite3_step(statement.statement); //Instruments says this is 100% the problem
if (SQLITE_BUSY == rc) {
// this will happen if the db is locked, like if we are doing an update or insert.
// in that case, retry the step... and maybe wait just 10 milliseconds.
retry = YES;
usleep(20);
if ([parentDB busyRetryTimeout] && (numberOfRetries++ > [parentDB busyRetryTimeout])) {
NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [parentDB databasePath]);
NSLog(@"Database busy");
break;
}
}
else if (SQLITE_DONE == rc || SQLITE_ROW == rc) {
// all is well, let's return.
}
else if (SQLITE_ERROR == rc) {
NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
break;
}
else if (SQLITE_MISUSE == rc) {
// uh oh.
NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
break;
}
else {
// wtf?
NSLog(@"Unknown error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
break;
}
} while (retry);
if (rc != SQLITE_ROW) {
[self close];
}
return (rc == SQLITE_ROW);
}
FMDB是我所知道的就像sqlite一样,它甚至值得吗?我应该废弃它并转移到可可触摸sqlite api?
最佳答案 好的,我实际上能够从FMDB邮件列表上的某个人那里获得这些信息.他建议我为我经常调用的db表添加一个索引,然后修复它!
显然,Apple在iOS 5中更改了sqlite的版本.
来自FMDB帖子:
在sqlite中创建索引很简单 – 请参阅sqlite.org了解语法.
诀窍在于确定要创建的索引.
在我的情况下,我有一个查询,如:
从x中选择a,b,c,其中sid = somevalue;
sid不是表的主键,因此没有索引
它.在sid上添加索引使得查询自索引以来更快
允许它快速找到元组.请注意,索引可能会变慢
更新,插入和删除表,所以不要只是随机添加
索引到你的表.查看您的查询并查看列
用于查询的where子句.