DatePicker停止CoreData工作

时间:2010-12-01 16:04:45

标签: iphone objective-c ipad core-data uidatepicker

我有一个应用程序,可以从UIDatePicker中保存文本和日期,然后在UIDatePicker中重新显示该日期时显示该注释。

它的作品很棒!只有我发现将UIDatePicker日期设置为今天才能阻止CoreData工作!

仅当我运行此setDate行时才会停止核心数据的运行。该应用程序运行良好而不会崩溃,它只是不保存任何数据。如果我评论这条线,它的作品很有魅力。但是,当应用程序加载时,我需要在今天使用UIDatePicker。

我在应用程序启动时使用它:

NSDate *now = [[NSDate alloc] init];
[datePicker setDate:now];

这是为了获取笔记:

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
        NSEntityDescription *testEntity = [NSEntityDescription entityForName:@"DatedText" inManagedObjectContext:self.managedObjectContext];
        [fetch setEntity:testEntity];
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"dateSaved == %@", datePicker.date];
        [fetch setPredicate:pred];

        NSError *fetchError = nil;
        NSArray *fetchedObjs = [self.managedObjectContext executeFetchRequest:fetch error:&fetchError];
        if (fetchError != nil) {
            NSLog(@"fetchError = %@, details = %@",fetchError,fetchError.userInfo);
        }
        noteTextView.text = [[fetchedObjs objectAtIndex:0] valueForKey:@"savedText"];

这是为了保存笔记:

NSManagedObject *newDatedText;
    newDatedText = [NSEntityDescription insertNewObjectForEntityForName:@"DatedText" inManagedObjectContext:self.managedObjectContext];
    [newDatedText setValue:noteTextView.text forKey:@"savedText"];
    [newDatedText setValue:datePicker.date forKey:@"dateSaved"];

    NSError *saveError = nil;
    [self.managedObjectContext save:&saveError];
    if (saveError != nil) {
        NSLog(@"[%@ saveContext] Error saving context: Error = %@, details = %@",[self class], saveError,saveError.userInfo);
    }

2 个答案:

答案 0 :(得分:2)

请记住,NSDate不仅会保存DD / MM / YYYY,还会保存HH:MM:SS。

我猜想当你从选择器中选择一个DD / MM / YYYY时,它会以0:00:00的默认时间保存,但在上面的情况下,当您将选择器日期设置为现在时,您实际上正在操作HH:MM:SS到其他东西(即使你没有手动看到它)。

为了说明我想说的内容,当你使用谓词(dateSaved == picker.date)获取时,它正在寻找DD / MM / YYYY 00:00:00格式的日期论证,你可能已经将它保存在DD / MM / YYYY 09:00:01。

如果您希望这样做,您需要对NSDate属性进行一些格式化。

答案 1 :(得分:0)

默认情况下,Datepicker仅设置为今天的日期。您不需要手动执行此操作。