在iOS 5中使用sqlite时,我面临一个问题。,我从两个表中获取记录:一个在食谱中,另一个在一个Menu.db中。
从菜谱表中,我得到了所有的记录,在此基础上,我从recipeid表中获取了记录。在iOS 4.2上运行时,不需要花时间获取记录,但当我在iOS 5上运行时,获取记录需要时间。请参阅下列代码:
NSString *query = [NSString stringWithFormat:@"select id from Recipes"];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, [query UTF8String], -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
rcp.recipeID = sqlite3_column_int(selectstmt, 0);
NSString *sql = [NSString stringWithFormat:@"select Name from Ingredients where recipeId = %d",rcp.recipeID];
sqlite3_stmt *stmt2;
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &stmt2, NULL) == SQLITE_OK) {
while(sqlite3_step(stmt2) == SQLITE_ROW) {}
}
}
}为什么在iOS 5.0中会出现这个问题,相同的代码在iOS 4.0,4.2上运行得很好?
我知道,我写的代码是对的,我想知道iOS 5.0中这个性能问题的确切原因,因为我的应用程序完全是围绕数据库构建的。
发布于 2012-06-28 09:19:18
在完成第一个查询的完整执行之后,尝试使用两个不同的函数,从第二个查询开始。
例如:-
NSString *query = [NSString stringWithFormat:@"select id from Recipes"];
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, [query UTF8String], -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
rcp.recipeID = sqlite3_column_int(selectstmt, 0);
}
}然后打电话
NSString *sql = [NSString stringWithFormat:@"select Name from Ingredients where recipeId = %d",rcp.recipeID];
sqlite3_stmt *stmt2;
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &stmt2, NULL) == SQLITE_OK) {
while(sqlite3_step(stmt2) == SQLITE_ROW) {}希望这有助于解决你的问题。
发布于 2012-06-28 11:18:32
我认为你和libsqlite3.dylib有联系。您应该将libsqlite3.0.dylib库链接起来。
发布于 2012-06-28 12:12:06
如果你想把你的.db转到.sqlite
打开您的.db文件,从CSV中选择表文件->export-> Table (用.csv格式保存您的文件)(就像选择所有表一样),然后打开.sqlite文件->Import->从CSV打开.sqlite文件后,在.csv文件中出现一个对话框,从第一行提取的字段名必须勾选,现在您的sqlite已经准备好了。
将此文件放入您的项目中
然后设置..sqlite/..db文件路径
现在,将select查询设置为
#import <sqlite3.h>
-(void)SelectSqlData:(NSString *)SearchString
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourfileName.sqlite"];
sqlite3_stmt *compiledStatement;
sqlite3 *database;
if(sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
const char *sqlStatement;
sqlStatement = "select c.field1,c.field2,c.field3,c.field4 from YourTableName1 as c, YourTableName2 as b where b.Artist_Id = ?";
sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
//printf("\nError===%s",sqlite3_errmsg(database));
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_text(compiledStatement,1,[SearchString UTF8String] , -1,SQLITE_STATIC);
while(sqlite3_step(compiledStatement) == SQLITE_ROW )
{
NSString *str_field1=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
NSString *str_field2=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
NSString *str_field3=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
NSString *str_field4=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
// add str_field into array
}
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}https://stackoverflow.com/questions/11099368
复制相似问题