在Objective-C中从Sqlite读取数据

时间:2016-06-13 00:23:14

标签: ios objective-c sqlite

我试图从Objective-C中的sqlite读取数据,但结果是QuestionNumber和TotalRate都是0,无法从sqlite读取值。请帮帮我如何更改我的代码?

-(void)readSqlite{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath =  [documentsDirectory stringByAppendingPathComponent:@"Questiondata.db"];
    NSLog(@"filePath,%@",filePath);
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if([fileManager fileExistsAtPath:filePath]){
        NSLog(@"database is exist.");
        NSMutableArray *retArray =  [[NSMutableArray alloc] init];
        const char *dbpath = [filePath UTF8String];
        if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) {

            NSLog(@"THIS IS OK");
            const char *insert_stmt = "SELECT QuestionNumber, TotalRate FROM Questions WHERE QuestionNumber = 2";
            sqlite3_stmt *statement;

            if (sqlite3_prepare_v2(_contactDB, insert_stmt, -1, &statement, NULL) == SQLITE_OK) {

                NSLog(@"SQLITE_OK");
                int QuestionNumberx = sqlite3_column_int(statement, 0);
                int TotalRate = sqlite3_column_int(statement, 1);

                NSLog(@"QuestionNumberx %d",QuestionNumberx );
                NSLog(@"TotalRate %d",TotalRate );

                [retArray addObject:[NSNumber numberWithInt:QuestionNumberx]];
                [retArray addObject:[NSNumber numberWithInt:TotalRate]];

                NSLog(@"%s db err '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(_contactDB), sqlite3_errcode(_contactDB));

                NSLog(@"retArray %@",retArray );

                sqlite3_finalize(statement);
            }
        }
    }else{
        NSLog(@"database is not exist.");
    }
}

1 个答案:

答案 0 :(得分:2)

您永远不会使用sqlite3_step实际执行查询。您也永远不会关闭数据库。

以下假设您只会从查询中返回一条记录:

-(void)readSqlite{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath =  [documentsDirectory stringByAppendingPathComponent:@"Questiondata.db"];
    NSLog(@"filePath,%@",filePath);
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if([fileManager fileExistsAtPath:filePath]){
        NSLog(@"database is exist.");
        NSMutableArray *retArray =  [[NSMutableArray alloc] init];
        const char *dbpath = [filePath UTF8String];
        if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) {

            NSLog(@"THIS IS OK");
            const char *insert_stmt = "SELECT QuestionNumber, TotalRate FROM Questions WHERE QuestionNumber = 2";
            sqlite3_stmt *statement;

            if (sqlite3_prepare_v2(_contactDB, insert_stmt, -1, &statement, NULL) == SQLITE_OK) {

                NSLog(@"SQLITE_OK");
                if (sqlite3_step(statement) == SQLITE_ROW) {
                    int QuestionNumberx = sqlite3_column_int(statement, 0);
                    int TotalRate = sqlite3_column_int(statement, 1);

                    NSLog(@"QuestionNumberx %d",QuestionNumberx );
                    NSLog(@"TotalRate %d",TotalRate );

                    [retArray addObject:[NSNumber numberWithInt:QuestionNumberx]];
                    [retArray addObject:[NSNumber numberWithInt:TotalRate]];

                    NSLog(@"retArray %@",retArray );
                }

                sqlite3_finalize(statement);
            } else {
                NSLog(@"Unable to prepare statement: %s db err '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(_contactDB), sqlite3_errcode(_contactDB));
            }

            sqlite3_close(_contactDB);
        } else {
            NSLog(@"Unable top open database.");
        }
    }else{
        NSLog(@"database is not exist.");
    }
}