我对Objective C很新,甚至在我的应用程序中使用SQL也是全新的。我正在尝试获取数据库中项目状态的运行计数。如果你能想象一个todo类型的应用程序,每个类别中有许多项目。下面的方法首先检索该类别中的项目总数,然后遍历每个类别并确定哪些具有“是”的值(如同检查/完成那样)。代码有效,但是我将它绑定到UIButton,所以当按下按钮时,会调用下面的方法以及显示数据的UIPopover。当前几次按下UIButton时,它会非常敏感并立即打开UIPopover,但是当它被多次按下时,速度会减慢,最终需要一两秒才能打开。我想知道正确执行此操作的最佳方法,而不会占用内存并保持一切响应。我必须做一些完全错误的事情,因为当你按下按钮打开弹出窗口时,它变得越来越迟钝。任何想法或建议都会非常感激。
-(void)doCount{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"ListDatabase.sql"];
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
for (NSString *element in self.countArray){
NSString *retrieveValue = [prefs objectForKey:@"selectedList"];
const char *sql = [[NSString stringWithFormat:@"SELECT COUNT(itemCategory)FROM '%@' WHERE itemCategory='%@'",retrieveValue,element]UTF8String];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
int totalcount = sqlite3_column_int(selectstmt,0);
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:totalcount forKey:@"count"];
}
const char *sql = [[NSString stringWithFormat:@"SELECT COUNT(itemDone)FROM '%@' WHERE itemDone='Yes' AND itemCategory ='%@'",retrieveValue,element]UTF8String];
sqlite3_stmt *getcountstmt;
if(sqlite3_prepare_v2(database, sql, -1, &getcountstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(getcountstmt) == SQLITE_ROW) {
int count = sqlite3_column_int(getcountstmt,0);
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
int totalcount = [prefs integerForKey:@"count"];
NSString *catCount = [NSString stringWithFormat: @"%i/%i",count,totalcount];
[prefs setObject:catCount forKey:element];
}
}
sqlite3_finalize(selectstmt);
sqlite3_finalize(getcountstmt);
}
}
}
sqlite3_close(database);
//[self getFinishedItems];
}
答案 0 :(得分:0)
格雷格 以上代码中的一些改进......
-(void)doCount{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"ListDatabase.sql"];
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
for (NSString *element in self.countArray){
NSString *retrieveValue = [prefs objectForKey:@"selectedList"];
NSMutableString * sqlQuery = [[NSMutableString alloc]initWithFormat:@"SELECT COUNT(itemCategory)FROM '%@' WHERE itemCategory='%@'",retrieveValue,element];
const char *sql = [sqlQuery UTF8String];
[sqlQuery release];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
int totalcount = sqlite3_column_int(selectstmt,0);
//comment following line.
//NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:totalcount forKey:@"count"];
}
sqlQuery =[[NSMutableString alloc]initWithFormat:@"SELECT COUNT(itemDone)FROM '%@' WHERE itemDone='Yes' AND itemCategory ='%@'",retrieveValue,element];
const char *sql = [sqlQuery UTF8String];
[sqlQuery release];
sqlite3_stmt *getcountstmt;
if(sqlite3_prepare_v2(database, sql, -1, &getcountstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(getcountstmt) == SQLITE_ROW) {
int count = sqlite3_column_int(getcountstmt,0);
//comment following lines...
//NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
int totalcount = [prefs integerForKey:@"count"];
NSMutableString *catCount = [[NSMutableString alloc]initWithFormat: @"%i/%i",count,totalcount];
[prefs setObject:catCount forKey:element];
[catCount release];
}
}
sqlite3_finalize(selectstmt);
sqlite3_finalize(getcountstmt);
}
}
}
sqlite3_close(database);
//[self getFinishedItems];
}
另外,您可以将dbPath创建代码放在其他位置,或者说全局设置它以便它不会创建也占用内存的自动释放对象......