正确地从SQLite数据库获取信息

时间:2011-04-10 12:25:51

标签: iphone database sqlite

我对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];

}

1 个答案:

答案 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创建代码放在其他位置,或者说全局设置它以便它不会创建也占用内存的自动释放对象......