Оптимизация памяти для запросов sqlite - нужна помощь - PullRequest
1 голос
/ 23 мая 2011

Я использую два метода для таблицы R / W sqlite:

+ (NSString *) getWeatherData:(int)rowID:(int)columnID {
    NSString *savedWeatherData = [[NSString alloc] init];
    if (sqlite3_open([[DBController getDBPath] UTF8String], &database) == SQLITE_OK) {

        const char *sql = "select * from TABLE where id=?";
        sqlite3_stmt *selectstmt;
        if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

            sqlite3_bind_int(selectstmt, 1, rowID);

            while(sqlite3_step(selectstmt) == SQLITE_ROW) {

                NSInteger primaryKey = sqlite3_column_int(selectstmt, 0); 
                Weather *weatherObj = [[Weather alloc] initWithPrimaryKey:primaryKey];

                weatherObj.weatherData = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, columnID)];
                savedWeatherData = weatherObj.weatherData;
                [weatherObj release];
            }

        }   
    }
    return [savedWeatherData autorelease];
}

И сохранить некоторые данные:

+ (void) saveDataToDataBase:(NSString *)columnToUpdate:(int)rowID:(NSString *)value {

    if (sqlite3_open([[DBController getDBPath] UTF8String], &database) == SQLITE_OK) {

        updateStmt = nil;

        NSString *sqlString = [[@"update TABLE set " stringByAppendingString:columnToUpdate] stringByAppendingString:@"=? where id=?"];

        const char *sql = [sqlString UTF8String];

        if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK) {
            NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));
        } else { // select statement ok

            sqlite3_bind_text(updateStmt, 1, [value UTF8String], -1, SQLITE_TRANSIENT); // replace first ? with value
            sqlite3_bind_int(updateStmt, 2, rowID);                                     // replace second ? with rowID

            if(SQLITE_DONE != sqlite3_step(updateStmt)) {
                NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database));
            } else {
               // NSLog(@"Update completed !!!");  
            }

            sqlite3_reset(updateStmt);
        }

        sqlite3_finalize(updateStmt);

    }
    else
    sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.

}

С инструментами я вижу довольно большое потребление памяти для sqlite. Информация: во время запуска приложения в БД хранится около 100 различных типов данных - для каждого из данных вызывается метод saveDataToDataBase. (В случае отсутствия подключения к Интернету - будет использоваться getWeatherData - и снова будет прочитано около 100 различных типов данных)

Подскажите, пожалуйста, можно ли оптимизировать потребление памяти.

Большое спасибо!

С уважением!

1 Ответ

0 голосов
/ 23 мая 2011

Вам нужно завершить это selectstmt. Также не стоит открывать и закрывать базу данных при каждом вызове. Вместо этого сохраняйте ссылку на базу данных и закрывайте ее только тогда, когда она вам больше не нужна. (Первый метод также не закрывает базу данных каждый раз.)

Кроме того, вы можете вставить это после открытия базы данных, чтобы установить размер кэша:

// Modify cache size so we don't overload memory. 50 * 1.5kb
if (sqlite3_exec(database, "PRAGMA CACHE_SIZE=50;", NULL, NULL, NULL) !
= SQLITE_OK) {
NSAssert1(0, @"Error: failed to set cache size with message '%s'.",
sqlite3_errmsg(database));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...