iOS-从同一数据库请求多个表的数据,返回不正确的值

iOS-从同一数据库请求多个表的数据,返回不正确的值,ios,sql,objective-c,database,sqlite,Ios,Sql,Objective C,Database,Sqlite,我目前正试图调用本地化的sqlite3数据库,以便从多个表中加载特定值。第一个请求是对FetchAllamForDiameter发出的,后者依次调用FetchBCForAllamModels。我可以验证我的请求语句是否正确,因为在SQLite Database Browser 2.0中将其作为查询语句运行时,它会返回正确的值。不过,在iOS应用程序上运行此命令时,它会返回0表示所有内容。有人知道为什么会这样吗 - (NSArray *)fetchAllAmmoForDiameter:(NSNu

我目前正试图调用本地化的sqlite3数据库,以便从多个表中加载特定值。第一个请求是对FetchAllamForDiameter发出的,后者依次调用FetchBCForAllamModels。我可以验证我的请求语句是否正确,因为在SQLite Database Browser 2.0中将其作为查询语句运行时,它会返回正确的值。不过,在iOS应用程序上运行此命令时,它会返回0表示所有内容。有人知道为什么会这样吗

 - (NSArray *)fetchAllAmmoForDiameter:(NSNumber *)d
{
    sqlite3 *database;
    NSMutableArray *allAmmoModels = [NSMutableArray new];
    NSString *db = [[NSBundle mainBundle] pathForResource:@"bulletlib" ofType:@"sqlite3"];

    if (sqlite3_open([db UTF8String], &database) == SQLITE_OK) {
        double diameter = [d doubleValue];
        NSString *query = [NSString stringWithFormat:@"SELECT _id, manufacturer_id, weight, length, model, hide_bcs FROM bullets WHERE diameter=%f ORDER BY diameter, manufacturer_id ASC", diameter ];
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                int uniqueID = sqlite3_column_int(statement, 0);
                int manufactureID = sqlite3_column_int(statement, 1);
                double weight = sqlite3_column_double(statement, 2);
                double length = sqlite3_column_double(statement, 3);
                char *model = (char *)sqlite3_column_text(statement, 4);

                //            NSLog(@"%d,%d,%f,%f %f, %s", uniqueID, manufactureID, diameter, weight, length, model );

                NSString *modelName = [NSString stringWithUTF8String:model];
                AmmoDatabaseModel *dbModel = [[AmmoDatabaseModel alloc]initWithUniqueId:uniqueID manufactureId:manufactureID diameter:diameter weight:weight length:length andModel:modelName];

                [allAmmoModels addObject:dbModel];
            }

        } else {
            printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );
        }
        sqlite3_finalize(statement);
        sqlite3_close(database);
        [self fetchBCForAllAmmoModels:allAmmoModels];

    }
    return allAmmoModels;

}


-(void)fetchBCForAllAmmoModels:(NSArray *)ammoModels

{
    for (AmmoDatabaseModel *ammoModel in ammoModels ){

        ammoModel.ballisticCoefficients = [self fetchBCForAmmoModel:ammoModel];

    }


}

-(NSArray *)fetchBCForAmmoModel:(AmmoDatabaseModel *)ammoModel
{
    NSMutableArray *bcModels = [NSMutableArray new];
    sqlite3 *database;
    NSString *db = [[NSBundle mainBundle] pathForResource:@"bulletlib" ofType:@"sqlite3"];

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


        NSString *query =  [NSString stringWithFormat:@"SELECT drag_func, bc, minvel FROM bullet_bcs WHERE bullet_id=%i", [ammoModel.uniqueID intValue]];
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                int dragFunction = sqlite3_column_double(statement, 1);
                double bc = sqlite3_column_double(statement, 2);
                int minvel = sqlite3_column_int(statement, 3);
                BallisticCoefficientDatabaseModel *bcModel = [[BallisticCoefficientDatabaseModel alloc] initWithDragFunction:dragFunction coefficient:bc minimumVelocity:minvel];
                [bcModels addObject:bcModel];
            }

        } else {
            printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );
        }
        sqlite3_finalize(statement);
        sqlite3_close(database);

    }
    return bcModels;
}

结果证明我的查询是正确的,并且成功地获取了数据。主要问题是数据库的模式(出于某些疯狂的原因)没有在它应该具有的记录行和记录列中提取正确的数据。我打印出我的数据,同时使用

NSString * str = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];

并将结果与各自的值对齐

您没有处理sqlite3\u prepare\u v2调用的else语句。您确定那里没有发生错误吗?是否可以添加else并尝试记录错误?如果出现错误,根据代码逻辑,您将返回一个空数组,这似乎是正在发生的事情。我将记住这一点并这样做。我没有在else中测试via的唯一原因是它确实进入了循环。没有错误打印到控制台,现在db在结束或发出下一个SQL请求之前肯定是关闭的。接下来,我将在控制台中打开数据库,以确认数据确实存储在数据库中。您可以将数据库路径cd中的db变量nslog到目录中,然后运行“sqlite3 bulletlib.db”。在sqlite3页面中,运行.dump命令。如果数据确实存在,那么问题肯定是您的select查询。现在,即使未打开数据库,也要关闭数据库。