Cocoa touch 通过FMDatabase将NSDate读写到sqlite数据库

Cocoa touch 通过FMDatabase将NSDate读写到sqlite数据库,cocoa-touch,cocoa,sqlite,nsdate,fmdb,Cocoa Touch,Cocoa,Sqlite,Nsdate,Fmdb,我怀疑NSDate是否可以使用FMDatabase直接存储或从数据库中读取 根据我的研究,FMDatabase从记录中读取数据,希望元组是一个双值。FMDatabase使用以下方法将该双精度值转换为日期: - (NSDate*) dateForColumn:(NSString*)columnName; { int columnIdx = [self columnIndexForName:columnName]; if (columnIdx == -1) { re

我怀疑NSDate是否可以使用FMDatabase直接存储或从数据库中读取

根据我的研究,FMDatabase从记录中读取数据,希望元组是一个双值。FMDatabase使用以下方法将该双精度值转换为日期:

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

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

    return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumn:columnName]];
}
这种方法的主要问题是,手动在数据库中输入数据的人很难理解代码中的数据库。因此,有些人不能简单地在GUI中以双值形式输入日期。一种方法是使用以下方法之一:

但这里的开销同样是每次使用类似于以下内容的插入操作来运行查询以输入记录:

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');
我希望将日期存储在数据库中:

并将其作为日期格式存储在数据库中,以便:

  • 在查询中利用日期比较功能
  • 使FMDatabase可读写此日期格式
  • FMDatabase是否可以直接与这种日期格式交互?或者这是FMDatabase的一个限制,我必须扩展FMDatabase类来处理NSDate到sqlite日期格式的读写

    谢谢


    编辑:FMDatabase的作者/主持人之一必须说明:

    从数据库中读取日期,该日期以YYYY-MM-DD格式输入

    我已扩展了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
    
    @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
    
    FMResultSet+Addition.m文件:

    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
    
    @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;
    }
    
    **编辑:虽然这适用于“从表名称中选择*”之类的查询,但在比较日期的查询中失败。我们需要解决这个问题