我是iOS新手。我正在尝试实现一个SQLite数据库。
我的问题是,当我从数据库中获取数据时,即使表中只有50条记录,也需要花费很多时间。
我确实为获取数据创建了一个单独的方法,因为很多时候我需要为不同的表检索数据。
我的方法:
-(NSArray*)fetch_data:(NSString *)table_name fields_arr:(NSMutableArray *)fields_arr{
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = dirPaths[0];
databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"test.db"]];
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
sqlite3_stmt *SelectStatement;
NSMutableDictionary *record_dict;
NSString *SelectQry=@"select ";
NSString *lastField = [fields_arr lastObject];
for (int i =0; i<[fields_arr count]; i++) {
if (fields_arr[i] == lastField) {
SelectQry = [SelectQry stringByAppendingString:[NSString stringWithFormat:@"%@ ",fields_arr[i]]];
} else {
SelectQry = [SelectQry stringByAppendingString:[NSString stringWithFormat:@"%@,",fields_arr[i]]];
}
}
SelectQry = [SelectQry stringByAppendingString:[NSString stringWithFormat:@"from %@",table_name]];
const char *query_stmt = [SelectQry UTF8String];
NSMutableArray *resultArray = [[NSMutableArray alloc]init];
if (sqlite3_prepare_v2(database,
query_stmt, -1, &SelectStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(SelectStatement) == SQLITE_ROW)
{
record_dict=[[NSMutableDictionary alloc]init];
for (int i = 0; i<[fields_arr count]; i++) {
NSString *field_value = [[NSString alloc]init];
field_value = [[NSString alloc] initWithUTF8String:
(const char *) sqlite3_column_text(SelectStatement, i)];
[record_dict setValue:field_value forKey:fields_arr[i]];
}
[resultArray addObject:record_dict];
}
return resultArray;
//sqlite3_reset(statement);
sqlite3_finalize(SelectStatement);
}
else{
sqlite3_finalize(SelectStatement);
return nil;
}
}
答案 0 :(得分:1)
在您的代码中,您为每次调用获取数据的方法打开数据库连接。这不是合适的方式。您必须只建立一次连接并使用它。
+(sqlite3 *)openDatabase{
if (database == NULL) {
NSString* str_path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [str_path stringByAppendingPathComponent:strDatabaseName];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
NSLog(@"Database Successfully Opened");
}
else {
NSLog(@"Error in opening database");
database = NULL;
}
}
return database;}
您可以在app delegate的应用程序启动时调用此方法,并在您定义其他数据库方法的类中定义此方法。我希望它会减少一些开销,也会减少一些时间。