2011-04-10 39 views
1

我是Objective C的新手,甚至是在我的应用程序中使用SQL的新手。我正在尝试获取数据库中项目状态的运行计数。如果您可以想象一个todo类型的应用程序,并在每个类别中包含多个项目。下面的方法首先检索类别中的项目总数,然后循环遍历每个类别并确定哪些具有“是”的值(如在yes中被检查/完成)。代码有效,但是我把它绑定到UIButton,所以当按下按钮时,下面的方法被调用,以及显示数据的UIPopover。当前几次按下UIButton时,它会非常快速地响应并立即打开UIPopover,但是当它被按下很多次时,速度变慢,最终需要一两秒才能打开。我想知道正确执行此操作的最佳方式,而不会占用内存并保持一切响应。我一定在做一些完全错误的事情,因为按下按钮打开弹出窗口时,它变得越来越迟钝。任何想法或建议将非常感激。正确地从SQLite数据库中获取信息

-(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

格雷格, 这里是在上面的代码中一些改进...

-(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创建代码别的地方或者说,设置它在全球范围,使其赢得了” t创建也占用内存的自动释放对象...