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