简体   繁体   中英

how to get absolute last 7 days data, instead of last 7 records in SQLite iPhones

]i have this graph that shows the last 7 records from my sqlite database, it works.

but i will like to know the absolute last 7 days.

在此处输入图片说明

this is my codes

if ([appDelegate.drinksOnDayArray count] >=7)
    {
        drunked = 7;
    }
    else {
        drunked = [appDelegate.drinksOnDayArray count];
    }


    if (drunked !=0) 
    {   
        if (drunked<7) {
        for (int i=drunked; i<7; i++) {

            //DayOfDrinks *drinksOnDay = [appDelegate.drinksOnDayArray objectAtIndex:i-1];

            NSString * dayString= [NSString stringWithFormat:@"Nil"];//[NSDate stringForDisplayFromDateForChart:drinksOnDay.dateConsumed];

            [dayArray addObject:dayString];//X label for graph the day of drink.

            }
        }

        for(int i=drunked; i>0; i--) 
        {
            DayOfDrinks *drinksOnDay = [appDelegate.drinksOnDayArray objectAtIndex:i-1];

            NSString * dayString= [NSDate stringForDisplayFromDateForChart:drinksOnDay.dateConsumed];

            [dayArray addObject:dayString];//X label for graph the day of drink.

            drinksOnDay.isDetailViewHydrated = NO;

            [drinksOnDay hydrateDetailViewData];

            NSNumber *sdNumber =  drinksOnDay.standardDrinks; // pass value over to Standard Drink Numbers

            //[sdArray addObject: sdNumber]; 

            float floatNum = [sdNumber floatValue]; // convert sdNumber to foat

            [sdArray addObject:[NSNumber numberWithFloat:floatNum]];//add float Value to sdArray
    }




    //Get max value using KVC


    fMax = [[sdArray valueForKeyPath:@"@max.floatValue"] floatValue];


    //Ceiling the max value
    imax = (int)ceilf(fMax);

    //Odd check to make even by checking right most bit
    imax = (imax & 0x1) ? imax + 1 : imax;

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:(imax / 2) + 1];

    //Assuming all numbers are positive 

    for(int i = 0; i <= imax; i +=2)
    {
        [array addObject:[NSString stringWithFormat:@"%d", i]];
    }

    NSLog(@"Array Value %@", array);

    NSLog(@"Day Array%@", dayArray);



    NSString *sData[drunked];// = malloc(7 * sizeof(NSString *));
    for (int i=0; i<drunked; i++) 
    {
        DayOfDrinks *drinksOnDay = [appDelegate.drinksOnDayArray objectAtIndex:i];
        sData[i] = [NSString stringWithFormat:@"%@",drinksOnDay.standardDrinks];

    }
    NSLog(@"sdArray %@",sdArray);
    if (drunked<7) {
        for (int i=drunked; i<7; i++) {
            sData[i]=[NSString stringWithFormat:@"0"];
        }
    }

my sqlite statement

- (void) hydrateDetailViewData {

    //If the detail view is hydrated then do not get it from the database.
    if(isDetailViewHydrated) return;

    self.standardDrinks = [NSDecimalNumber zero];
    NSDecimalNumber *decimal = [NSDecimalNumber zero];

    if(detailStmt == nil) {
        const char *sql = "SELECT volume, percentage FROM consumed WHERE DATE(datetime) = ?";
        if(sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating detail view statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(detailStmt, 1, [[NSDate stringFromDate:self.dateConsumed withFormat:@"yyyy-MM-dd"] UTF8String], -1, SQLITE_TRANSIENT);

    static NSDecimalNumberHandler* roundingBehavior = nil;

    if (roundingBehavior == nil) {
        roundingBehavior = 
        [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
    }       

    while(sqlite3_step(detailStmt) == SQLITE_ROW) {
        double volumeDN = sqlite3_column_double(detailStmt, 0);
        double percentageDN = sqlite3_column_double(detailStmt, 1);
        double drinks = ((volumeDN/1000) * percentageDN);
        NSDecimalNumber *drinksDec = [[NSDecimalNumber alloc] initWithDouble:drinks];
        NSDecimalNumber *countryRate = [[NSDecimalNumber alloc] initWithDouble:0.789];
        decimal = [decimal decimalNumberByAdding:[drinksDec decimalNumberByMultiplyingBy:countryRate]];
        //NSLog([NSString stringWithFormat:@"Standard Drinks - %@", self.standardDrinks]);
    }

    self.standardDrinks = [decimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];


    //Reset the detail statement so it can be used again without preparing the statement again.
    sqlite3_reset(detailStmt);

    //Set isDetailViewHydrated as YES, so we do not get it again from the database.
    isDetailViewHydrated = YES;
}


+ (void) getInitialDataToDisplay:(NSString *)dbPath {

    DrinkTabsAndNavAppDelegate *appDelegate = (DrinkTabsAndNavAppDelegate *)[[UIApplication sharedApplication] delegate];

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

        const char *sql = "SELECT DATE(datetime) FROM consumed GROUP BY DATE(datetime) ORDER BY datetime DESC";
        sqlite3_stmt *selectstmt;
        if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

            while(sqlite3_step(selectstmt) == SQLITE_ROW) {
                NSString *dateDrunk = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];
                NSDate *theDate = [NSDate dateFromString:dateDrunk withFormat:@"yyyy-MM-dd"];
                DayOfDrinks *drinkDayObj = [[DayOfDrinks alloc] initWithDateConsumed:theDate];
                [drinkDayObj hydrateDetailViewData];
                //NSLog([NSDate stringFromDate:drinkDayObj.dateConsumed withFormat:@"yyyy-MM-dd"]);
                [appDelegate.drinksOnDayArray addObject:drinkDayObj];
                [drinkDayObj release];
            }
        }
    }
    else
        sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.

}

Without going through those blocks of code, I'll hazard a guess here:

SELECT * FROM CONSUMED WHERE DATE BETWEEN ? AND ?

Set up a date 7 days ago (7*24*60*60*1000 milliseconds ago), as well as now, and bind those to the question marks.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM