2011-12-28 91 views
0

我懷疑NSDate是否可以直接存儲或使用FMDatabase從數據庫讀取或不讀取。通過FMDatabase讀取和寫入NSDate到sqlite數據庫

根據我的研究,FMDatabase從記錄中讀取日期,預計該元組爲雙值。 FMDatabase是雙值轉換爲日期此方法:

- (NSDate*) dateForColumn:(NSString*)columnName; { 
    int columnIdx = [self columnIndexForName:columnName]; 

    if (columnIdx == -1) { 
     return nil; 
    } 

    return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumn:columnName]]; 
} 

這種方法的主要問題是,這將是困難的誰是手工在數據庫中輸入數據的人,以便它在可以理解的FMDatabase代碼。所以有人不能簡單地在GUI中以double值輸入日期。一種方法是使用these functions

date(timestring, modifier, modifier, ...) 
time(timestring, modifier, modifier, ...) 
datetime(timestring, modifier, modifier, ...) 
julianday(timestring, modifier, modifier, ...) 
strftime(format, timestring, modifier, modifier, ...) 

之一,但這裏的開銷又是每次運行一個查詢使用類似這樣的插入操作進入了一個紀錄:

Compute the current date. 
SELECT date('now'); 

Compute the last day of the current month. 
SELECT date('now','start of month','+1 month','-1 day'); 

我想日期被存儲在數據庫中following format

TEXT as ISO8601 strings ("YYYY-MM-DD") 

並將其存儲爲日期格式的數據庫,以便我可以:

  1. 在查詢中利用日期比較工具。
  2. 使FMDatabase可以讀取和寫入這種日期格式。

FMDatabase是否有任何直接的方式可以與這種日期格式進行交互?或者這是FMDatabase的限制,我將不得不擴展FMDatabase類來處理NSDate讀取和寫回到sqlite日期格式?

感謝

編輯:一個FMDatabase的作者/主持人不得不說this一下:從數據庫,在格式YYYY-MM-DD進入http://code.google.com/p/flycode/issues/detail?id=16#c1

回答

2

閱讀日期

我已經擴展了FMResultSet類以包括以下附加方法:

FMResultSet + Addtion.h文件:

typedef enum 
{ 
    eText, 
    eReal, 
    eInteger 
}EDateAndTimeDataType; 
// Reference: http://www.sqlite.org/datatype3.html 

typedef enum 
{ 
    eDateString // YYYY-MM-DD format 
    // Rest is un implemented 
}EDateAndTimeFunctionType; 
// Refernce: http://www.sqlite.org/lang_datefunc.html 

@interface FMResultSet (Additions) 

-(NSDate*)dateForColumn:(NSString *)columnName withDataType:(EDateAndTimeDataType)inDateDataType functionType:(EDateAndTimeFunctionType)inFunctionType; 
-(NSDate*)dateForColumnIndex:(int)columnIdx withDataType:(EDateAndTimeDataType)inDateDataType functionType:(EDateAndTimeFunctionType)inFunctionType; 

@end 

FMResultSet + Addition.m文件:

@implementation FMResultSet (Additions) 

-(NSDate*)dateForColumn:(NSString *)columnName withDataType:(EDateAndTimeDataType)inDateDataType functionType:(EDateAndTimeFunctionType)inFunctionType 
{ 
    return [self dateForColumnIndex:[self columnIndexForName:columnName] 
         withDataType:inDateDataType 
         functionType:inFunctionType]; 
} 

-(NSDate*)dateForColumnIndex:(int)columnIdx withDataType:(EDateAndTimeDataType)inDateDataType functionType:(EDateAndTimeFunctionType)inFunctionType 
{ 
    NSAssert (eText==inDateDataType, @"Only Text type is implemented for now"); 
    NSAssert (eDateString==inFunctionType, @"Only date() function type is implemented for now"); 

    NSDate *theDate = nil; 
    NSString *dateString = [self stringForColumnIndex:columnIdx]; 
    if (nil!=dateString) 
    { 
     theDate = [Utility getDateFromString:dateString 
           withDateFormat:@"yyyy-MM-dd"]; 
     NSLog(@"Date from DB: %@", theDate); 
    } 
    return theDate; 
} 

@end 

實用程序:

+(NSDate *)getDateFromString:(NSString *)inString withDateFormat:(NSString*)inDateFormat 
{ 
    NSDate *date =nil; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setDateFormat:inDateFormat]; 

    NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
    [dateFormatter setLocale:enUSPOSIXLocale]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    [enUSPOSIXLocale release]; 

    date = [dateFormatter dateFromString:inString]; 
    [dateFormatter release]; 
    return date; 
} 

* *編輯:雖然這個工程的查詢,如「選擇表名*」它不能在日期比較查詢。爲此需要解決方案。