好的,我的SQLite3 SELECT语句遇到了很多问题。我的应用程序将GPS坐标存储在我的表中作为双倍。然后它以与double相同的方式检索它们。我的问题是,每次我尝试检索它们时,它返回0.000000作为我的纬度/经度值。
我知道SELECT语句是有效的,因为我在SQLiteBrowser中测试它,我知道数据库就在那里,因为我在我的模拟器文档中找到它,并再次使用SQLiteBrowser打开它。
如果有人能告诉我它为什么返回0.000000而不是37.337434(表中的实际值)那么我会很感激帮助!
-(double)getLatitudeBysourceMonitor:(NSString *)asourceMonitor andpositionNo:(NSNumber *)apositionNo {
double latitude;
NSLog(@"sourcemonitor:%@ positionno:%@",asourceMonitor, apositionNo);
// Open the database from the users filessytem
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"GPS.db"];
if (sqlite3_open([databasePath UTF8String], &databaseHandle) == SQLITE_OK)
NSLog(@"Database opened properly");
{
// Setup the SQL Statement and compile it for faster access
NSString *sqlStatement = [NSString stringWithFormat:@"SELECT latitude FROM GPSJob;"];
NSLog(@"Searching for values %@ and %d", asourceMonitor, [apositionNo intValue]);
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(databaseHandle, [sqlStatement UTF8String], -1, &statement, NULL) == SQLITE_OK) {
NSLog(@"Statement prepared");
while(sqlite3_step(statement) == SQLITE_ROW)
{
// Need to get data from database...
latitude = sqlite3_column_double(statement, 3);
NSLog(@"%f", sqlite3_column_double(statement, 3));
}
}
// Release the compiled statement from memory
sqlite3_finalize(statement);
}
NSLog(@"Reading latitude as: %f", latitude);
return latitude;
}
答案 0 :(得分:2)
您对sqlite3_column_double
的来电不正确。第二个参数需要是查询返回的列列表的索引。您只查询1列,因此索引必须为0
。
latitude = sqlite3_column_double(statement, 0);
NSLog(@"latitude = %f", latitude);
其他一些问题。如果您确实准备了声明,则只调用sqlite3_finalize
。如果打开数据库,请不要忘记关闭数据库。如果sqlite3_errmsg
或sqlite3_open
失败,请使用sqlite3_prepapre_v2
来记录错误。