Ошибка при представлении дат, которые я сохранил в базе данных sqlite3 при разработке iphone

#iphone #objective-c #date #sqlite

#iPhone #objective-c #Дата #sqlite

Вопрос:

Я получаю эту ошибку при попытке представить сохраненные даты, мой вопрос в том, что это за ошибка?

ошибка:

 2011-11-13 10:06:36.001 Holiday[217:207] -[NSNull cc_componentsForMonthDayAndYear]: unrecognized selector sent to instance 0x259ed68
2011-11-13 10:06:36.039 Holiday[217:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull cc_componentsForMonthDayAndYear]: unrecognized selector sent to instance 0x259ed68'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02534b99 __exceptionPreprocess   185
    1   libobjc.A.dylib                     0x0268440e objc_exception_throw   47
    2   CoreFoundation                      0x025366ab -[NSObject(NSObject) doesNotRecognizeSelector:]   187
    3   CoreFoundation                      0x024a62b6 ___forwarding___   966
    4   CoreFoundation                      0x024a5e72 _CF_forwarding_prep_0   50
    5   Holiday                             0x00008c7e  [KalDate dateFromNSDate:]   44
    6   Holiday                             0x0000fc36 -[KalViewController loadedDataSource:]   265
    7   Holiday                             0x000081d4 -[HolidaySqliteDataSource loadHolidaysFrom:to:delegate:]   873
    8   Holiday                             0x00008560 -[HolidaySqliteDataSource presentingDatesFrom:to:delegate:]   97
    9   Holiday                             0x0000f848 -[KalViewController reloadData]   162
    10  Holiday                             0x0000fe16 -[KalViewController showAndSelectDate:]   276
    11  Holiday                             0x000065ab -[HolidayAppDelegate showAndSelectToday]   90
    12  UIKit                               0x002e27f8 -[UIApplication sendAction:to:from:forEvent:]   119
    13  UIKit                               0x004ee68b -[UIBarButtonItem(UIInternal) _sendAction:withEvent:]   156
    14  UIKit                               0x002e27f8 -[UIApplication sendAction:to:from:forEvent:]   119
    15  UIKit                               0x0036dde0 -[UIControl sendAction:to:forEvent:]   67
    16  UIKit                               0x00370262 -[UIControl(Internal) _sendActionsForEvents:withEvent:]   527
    17  UIKit                               0x0036ee0f -[UIControl touchesEnded:withEvent:]   458
    18  UIKit                               0x003063d0 -[UIWindow _sendTouchesForEvent:]   567
    19  UIKit                               0x002e7cb4 -[UIApplication sendEvent:]   447
    20  UIKit                               0x002ec9bf _UIApplicationHandleEvent   7672
    21  GraphicsServices                    0x02d90822 PurpleEventCallback   1550
    22  CoreFoundation                      0x02515ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__   52
    23  CoreFoundation                      0x02476807 __CFRunLoopDoSource1   215
    24  CoreFoundation                      0x02473a93 __CFRunLoopRun   979
    25  CoreFoundation                      0x02473350 CFRunLoopRunSpecific   208
    26  CoreFoundation                      0x02473271 CFRunLoopRunInMode   97
    27  GraphicsServices                    0x02d8f00c GSEventRunModal   217
    28  GraphicsServices                    0x02d8f0d1 GSEventRun   115
    29  UIKit                               0x002f0af2 UIApplicationMain   1160
    30  Holiday                             0x00001fd4 main   102
    31  Holiday                             0x00001f65 start   53
    32  ???                                 0x00000001 0x0   1
)
terminate called after throwing an instance of 'NSException'
  

представление кода функции :

 - (void)loadHolidaysFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate
{
  NSLog(@"Fetching holidays from the database between %@ and %@...", fromDate, toDate);
    sqlite3 *db;
  NSDateFormatter *fmt = [[[NSDateFormatter alloc] init] autorelease];

    if(sqlite3_open([[self databasePath] UTF8String], amp;db) == SQLITE_OK) {
        const char *sql = "select name, country, date_of_event from holidays where date_of_event between ? and ?";
        sqlite3_stmt *stmt;
        if(sqlite3_prepare_v2(db, sql, -1, amp;stmt, NULL) == SQLITE_OK) {
      [fmt setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
      sqlite3_bind_text(stmt, 1, [[fmt stringFromDate:fromDate] UTF8String], -1, SQLITE_STATIC);
      sqlite3_bind_text(stmt, 2, [[fmt stringFromDate:toDate] UTF8String], -1, SQLITE_STATIC);
      [fmt setDateFormat:@"yyyy-MM-dd"];
            while(sqlite3_step(stmt) == SQLITE_ROW) {
                NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 0)];
                NSString *country = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
        NSString *dateAsText = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];
        [holidays addObject:[Holiday holidayNamed:name country:country date:[fmt dateFromString:dateAsText]]];
            }
        }
        sqlite3_finalize(stmt);
    }
    sqlite3_close(db);
  [delegate loadedDataSource:self];
}
  

функция вставки, которая вставляет даты

 -(NSNumber*) insertDate: (NSDate*) d
{
    NSLog(@"inserting date into database");
    sqlite3 *db;
    NSNumber *re = [NSNumber numberWithInt:-1];
    NSDateFormatter *fmt = [[[NSDateFormatter alloc]init]autorelease];
    if(sqlite3_open([[self databasePath]UTF8String],amp;db)==SQLITE_OK){
        const char *sql = "insert into holidays(name, country, date_of_event) values(?,?,?)";
        sqlite3_stmt *addStmt;
        if(sqlite3_prepare_v2(db,sql,-1,amp;addStmt,NULL)==SQLITE_OK){
            [fmt setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
            NSString *country = @"country test";
            NSString *name =@"name test";
            sqlite3_bind_text(addStmt,1,[name UTF8String],-1,SQLITE_STATIC);
            sqlite3_bind_text(addStmt,2,[country UTF8String],-1,SQLITE_STATIC);
            sqlite3_bind_text(addStmt,3,[[fmt stringFromDate:d]UTF8String],-1,SQLITE_STATIC);
        }
        if(SQLITE_DONE != sqlite3_step(addStmt)){
            NSAssert1(0,@"Error in inserting into database %s",sqlite3_errmsg(db));
        }else {
            re = [NSNumber numberWithInt: sqlite3_last_insert_rowid(db)];
            sqlite3_finalize(addStmt);
            sqlite3_close(db);
        }
    }
    return re;
}
  

Комментарии:

1. По какой-либо причине вы не включили dateFromNSDate, где на самом деле произошла ошибка?

2. @DanielRHicks, где именно, вы имеете в виду, я должен это использовать?

3. Я имею в виду показать нам источник для этого, поскольку именно там произошла ошибка.

Ответ №1:

Я получил то же сообщение об ошибке. Мое решение требовало, чтобы я «отключил» время от моей строки даты. Другие слова усекают «2013-06-03 13:42:34 0000» до «2013-06-03». Функция Kal, вызванная holiday, хотела только дату.

Ответ №2:

Проблема в том, что Kal принимает NSDate в качестве входных данных в своих внутренних методах. Поэтому убедитесь, что ваш объект имеет NSDate, а не NSString!