如何解决sqlite请求的内存优化-需要帮助
| 我使用两种方法来读写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,&updateStmt,NULL) != SQLITE_OK) {
NSAssert1(0,@\"Error while creating update statement. \'%s\'\",sqlite3_errmsg(database));
} else { // select statement ok
sqlite3_bind_text(updateStmt,[value UTF8String],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的内存消耗很大。
信息:在应用程序启动期间,cca 100种不同类型的数据存储在DB中-对于每种数据,都会调用此saveDataToDataBase方法。 (在没有互联网连接的情况下-将使用getWeatherData-并再次读取cca 100种不同的数据)
请,你能告诉我-是否可以优化内存消耗。
非常感谢!
亲切的问候!
解决方法
您需要最终确定
selectstmt
。另外,您不应在每次调用时打开和关闭数据库。保留对数据库的引用,仅在确实不再需要它时才关闭它。 (第一种方法也不是每次都关闭数据库。)
另外,您可以在打开数据库后将其放入以设置缓存大小:
// Modify cache size so we don\'t overload memory. 50 * 1.5kb
if (sqlite3_exec(database,\"PRAGMA CACHE_SIZE=50;\",NULL,NULL) !
= SQLITE_OK) {
NSAssert1(0,@\"Error: failed to set cache size with message \'%s\'.\",sqlite3_errmsg(database));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。