2013-07-18 44 views
1

剛剛幾分鐘之前它完美的工作,突然不知道發生什麼事,並havnt改變任何東西,但它不工作了嘗試過這麼多,但無法弄清楚什麼我缺少任何幫助是像下面上天對我來說是我的代碼問題相關的源碼從數據庫日期間獲取日期IOS

這是我的日期是如何在我的SQLite datbase 1978年1月20日

 01/20/2013 

     02/28/1979 


     MM/dd/yyyy 


NSLog(@"Fetching holidays from the database between %@ and %@...", fromDate, toDate); 
// fromdate and todate both are nsdate this is what they prints 
// Fetching holidays from the database between 2013-06-29 18:30:00 +0000 and 2013-08-03 18:29:59 +0000... 
    NSDateFormatter *fmt = [[[NSDateFormatter alloc] init] autorelease]; 



    NSString *query4 = [[NSString alloc] initWithFormat:@"select Birthdates,Names,Profilepic,Email,Phonenumber from PersonNamesAndBirthDates where Birthdates between ? and ?"]; 


    sqlite3_stmt *stmt4; 
    int x4 = sqlite3_prepare_v2(database1,[query4 UTF8String],-1, &stmt4, nil); 
    if (x4 == SQLITE_OK) 
     [fmt setDateFormat:@"MM/dd/yyyy"]; 

     sqlite3_bind_text(stmt4, 1, [[fmt stringFromDate:fromDate] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_text(stmt4, 2, [[fmt stringFromDate:toDate] UTF8String], -1, SQLITE_STATIC); 
    //**IT WAS GOING IN WHILE BUT NOW ITS NOT GOING IN SO IT JUST JUMP FROM HERE** 
    while(sqlite3_step(stmt4) == SQLITE_ROW) 
    { 
     NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 0)]; 
     NSString *proPic = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 1)]; 
     NSString *email = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 2)]; 
     NSString *pNumber = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 3)]; 
     NSString *bDate = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 4)]; 


     [holidays addObject:[Holiday holidayNamed:name email:email profilePic:proPic phoneNumber:pNumber date:[fmt dateFromString:bDate]]]; 


     NSLog(@"%@",holidays); 

    } 
    sqlite3_finalize(stmt4); 
    NSLog(@"%@",holidays); 

    sqlite3_close(database1); 
    [delegate loadedDataSource:self]; 

}

+0

來到這個iphone-ipad室這裏是鏈接http://chat.stackoverflow.com/rooms/682/iphone-ipad – freelancer

回答

4

的格式相匹配您在數據庫中使用的,但問題是,該格式將不會按時間順序排序的日期。 SQLite沒有一個適當的日期數據類型和公正,而不是存儲的日期作爲字符串(或數字還,但不是真正的「日期」數據類型)。更糟的是,由於當前的字符串值被格式化爲MM/dd/yyyy,它會按字母順序,因此,隨後的一天,那麼今年對它們進行排序,即按月份,按時間順序沒有。

的解決方案是:

  • yyyy-MM-dd格式通過你的數據庫,並更換日期值,當前存儲在的MM/dd/yyyy格式的字符串,字符串值。

  • 同樣,你上面的代碼示例中,替換:

    [fmt setDateFormat:@"MM/dd/yyyy"]; 
    

    [fmt setDateFormat:@"yyyy-MM-dd"]; 
    

您還可以使用在Date And Time Functions列舉的格式之一。但挑這樣的格式,當你按字母順序排序,它也有效地按時間順序排序,以及。


雖然你真的應該修復數據庫中的數據,您可以定義自定義SQLite的功能,可以從MM/dd/yyyy轉換爲yyyy-MM-dd的飛行。所以,你的@implementation之前,聲明這個新功能:

void convertFromMMDDYYYY(sqlite3_context *context, int argc, sqlite3_value **argv); 

然後,你@implementation@end後,實現這個功能:

/* 
convert from MM/dd/yyyy 
to   yyyy-MM-dd 
*/ 
void convertFromMMDDYYYY(sqlite3_context *context, int argc, sqlite3_value **argv) 
{ 
    assert(argc == 1); 

    if (sqlite3_value_type(argv[0]) != SQLITE_TEXT) { 
     sqlite3_result_null(context); 
     return; 
    } 

    NSString *originalDateString = [NSString stringWithUTF8String:(const char *)sqlite3_value_text(argv[0])]; 

    static NSDateFormatter *mmddyyyyFormat = nil; 
    static NSDateFormatter *yyyymmddFormat = nil; 

    // date formatters are a little computationally intensive to create, so let's only do it once 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     mmddyyyyFormat = [[NSDateFormatter alloc] init]; 
     mmddyyyyFormat.dateFormat = @"MM/dd/yyyy"; 

     yyyymmddFormat = [[NSDateFormatter alloc] init]; 
     yyyymmddFormat.dateFormat = @"yyyy-MM-dd"; 
    }); 

    NSDate *date = [mmddyyyyFormat dateFromString:originalDateString]; 
    if (date == nil) 
    { 
     sqlite3_result_null(context); 
     return; 
    } 

    NSString *resultingDateString = [yyyymmddFormat stringFromDate:date]; 
    char *buf = sqlite3_malloc(sizeof(char) * [resultingDateString length] + 1); 
    strcpy(buf, [resultingDateString UTF8String]); 

    sqlite3_result_text(context, buf, -1, sqlite3_free); 
} 

現在,當您的應用程序打開數據庫,定義一個SQLite功能,YYYYMMDD,這將調用根據上述程序:

if (sqlite3_create_function_v2(database1, "YYYYMMDD", 1, SQLITE_ANY, NULL, &convertFromMMDDYYYY, NULL, NULL, NULL) != SQLITE_OK) 
    NSLog(@"%s: sqlite3_create_function_v2 error: %s", __FUNCTION__, sqlite3_errmsg(database1)); 

然後你就可以改變你的SQL援用自己這個新的SQLite功能:

NSString *query4 = @"select Birthdates,Names,Profilepic,Email,Phonenumber from PersonNamesAndBirthDates where YYYYMMDD(Birthdates) between ? and ?"; 

,當然,因爲這是尋找yyyy-MM-dd格式,你應該使用格式綁定爲WHERE條款在這個特定的SQL語句的值:

sqlite3_stmt *stmt4; 
int x4 = sqlite3_prepare_v2(database1,[query4 UTF8String],-1, &stmt4, nil); 
if (x4 == SQLITE_OK) { 
    [fmt setDateFormat:@"yyyy-MM-dd"]; 

    // ... 
} 

同樣,最好修復數據,但可以使用此自定義函數方法。這是一種非常低效的方式,但應該起作用。

+0

爲什麼我需要在一個月的一天內合併嗎?爲什麼不能在mm dd yyyy – java

+0

我改變了我的formater爲[fmt setDateFormat:@「yyyy/MM/dd」];不工作 – java

+0

你能否請更新我的代碼,所以我得到清晰的想法 – java

0

必須使用supported date/time formats之一的比較正常工作。

+0

正如你可以看到,我已經創建了與我的數據庫日期相同的formater – java