Правильно получать информацию из базы данных SQLite - PullRequest
1 голос
/ 10 апреля 2011

Я довольно новичок в Objective C, и даже новичок в использовании SQL внутри моих приложений.Я пытаюсь получить текущий счетчик состояния элементов в моей базе данных.Если вы можете себе представить приложение типа todo, с количеством элементов в каждой категории.Приведенный ниже метод сначала извлекает общее количество элементов в категории, затем просматривает каждую категорию и определяет, какие из них имеют значение «Да» (как в случае «Да», оно проверяется / завершается).Код работает, но я привязал его к UIButton, поэтому при нажатии кнопки вызывается метод, описанный ниже, а также UIPopover, который отображает данные.Когда кнопка UIB нажимается первые несколько раз, она очень отзывчива и немедленно открывает 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 голосов
/ 10 апреля 2011

Грэг, вот несколько улучшений в приведенном выше коде ...

-(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 в другое место или сказать, настроить его глобально, чтобы он не создавалобъект автоматического освобождения, который также занимает память ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...