views:

271

answers:

1

I'm trying to get a float to show up with the decimal point in my sqlite table. I've included the code below for how it shoes up in the game which is all fine. As well as for what happens at the end of a level. And how it gets updated to the sqlite table. It shoes up fine as a decimal during the game, but it gets recorded to the table as a whole number with a .0 after it. So if the final time was 52.4 it will show up as 52.0. I have the field type set to FLOAT. Please help.

Here's how it shoes up in the game, it counts up by tenths of a second.

-(void)updateTimerLabel{

if(appDelegate.gameStateRunning == YES){
timeSeconds-= 0.1;
timerLabel.text=[NSString stringWithFormat:@"Time: %.1f", timeSeconds];
}
}

This is the code for the end of a level...

-(void) endLevel{
if(appDelegate.easymediumhard ==2){

    if(gameVarLevel!=5){
        stageCompleted = [[UIAlertView alloc] initWithTitle:@"Sweet!" message:@"Level Completed. Play next level?" delegate:self cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil];
    }

    else if(gameVarLevel == 5){
        globalScore = timeSeconds;
        if(appDelegate.ScoreID==0)
        {
            appDelegate.ScoreID=[appDelegate InsertGame]; 
        }
        else{

            [appDelegate updateScores:appDelegate.ScoreID];
        }

        stageCompleted = [[UIAlertView alloc] initWithTitle:@"Sweet!" message:@"All Levels Complete!\n Play again?" delegate:self cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil];
    }
    }
}

And this is how it gets updated to the table...

-(void)updateScores:(NSInteger)Primary_key
{
    sqlite3_stmt *statement=nil;
    NSString  *sql=nil; 
    @try
    {
        statement=nil;
        sql=nil;

if(easymediumhard == 2){
            sql=[NSString stringWithFormat:@"update tblHard set Score=? where id=%d",Primary_key];
        }
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, NULL)!=SQLITE_OK)
        {
            NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
        }

        sqlite3_bind_int(statement, 1, globalScore);

        int success=sqlite3_step(statement);

        if (success == SQLITE_ERROR) {

            NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(database));
        }
        sqlite3_finalize(statement);
        statement=nil;
        sql=nil;
    }
    @catch (NSException *e) 
    {
        NSLog(@"asd");
    }
}
A: 

Use sqlite3_bind_double instead of sqlite3_bind_int. And make sure that globalScore is actually a floating-point variable (the code you posted does not make it clear whether it is one).

Ole Begemann
floatint-point?? Is that just making it float globalScore in the .h file?
NextRev
it definitely works, but any idea how to keep it to 1 or 2 decimal points? Right now it's listing quite a bit...
NextRev
Many decimal numbers (like 0.5) cannot be accurately expressed in the floating-point format. You shouldn't really care about the number of decimal digits stored in the database. Do your number formatting when you display the data instead (as you already do in the code you posted). You could do something like `round(x * 10.0) / 10.0;` to round x to one decimal digit but it wouldn't really change anything in your case (because 0.5 cannot be expressed in floating point).
Ole Begemann