如何使用 CoreData 控制用户输入

Posted

技术标签:

【中文标题】如何使用 CoreData 控制用户输入【英文标题】:How to control user input with CoreData 【发布时间】:2013-07-16 13:05:18 【问题描述】:

我真的不是 ios 专家,但我一直在开发一个应用程序来学习东西。在应用程序中,我有一个 tableView,其中有两行用于输入核心数据:NSDate 属性和NSString 属性(数值)。

应用中的用户每天都会输入这些值。我想要实现的是在存储这些值之前进行某种输入检查,例如:

1- 首先,我想确保用户一天输入的 NSString 属性(主要是数字)永远不会小于前一天并且永远不能在同一天输入两个值。

2- 然后,我想让 NSDate 属性始终从当前日期开始并且永远不允许用户选择过去的日期。

如果我的问题很琐碎,我深表歉意,我真的需要一些帮助。

更新:问题编号nsdate输入约束已解决。现在以下问题仍然存在:

我想允许用户在表格视图的各自单元格中输入值。然后当他点击保存按钮(**它已实现)时,会显示一条**警告或简单的文本消息,要求他更改输入的值,因为他输入的值小于之前输入的值天。前一天由他选择的 NSDate 输入属性定义(见截图链接:http://i.stack.imgur.com/gJnkP.png,其中单元格 1 表示属性数值,单元格 2 是 NSdate 属性。

【问题讨论】:

如果您的字符串仅用于存储数字,那么您真正应该使用的是NSNumber 而不是NSString 【参考方案1】:

将这段代码用于我希望 NSDate 属性始终从当前日期开始,并且永远不允许用户选择过去的日期。

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:0];
 NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[shiftDatePicker setMinimumDate:minDate];

用你的UIDatePicker 名字代替我的名字。

你的第一个问题的答案有点理论化。但我希望你能理解。

首先,您应该在UIViewController 中获取 Table 的对象。从CoreData 获取值并与输入的用户匹配。如果用户输入了更大的值,那么没有问题。如果小于或等于之前的值,向他们显示错误。

将此用于您的第一个问题。

- (NSFetchRequest *)getBasicRequestForEntityName: (NSString *)entityName

    //Get Fetch request for particuler entity.
    NSManagedObjectContext * managedObjectContext = [[AppDelegate getAppdelegate] managedObjectContext];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    return request;



-(NSMutableArray*)getAllRequestedShifts

    NSFetchRequest *request = [self getBasicRequestForEntityName:@"YOUR ENTITY NAME"];

    [request setReturnsObjectsAsFaults:NO];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"previous value" ascending:NO];

    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];


    NSError *error = nil;
    NSArray *results = [[managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
    NSMutableArray *arr=[NSMutableArray array];

    if (!error && [results count] > 0)
    

        for (int k=0; k<[results count]; k++)
        
            YourentityObject *requestShiftObj = [results objectAtIndex:k];
            [arr addObject:requestShiftObj];
        

    
    return arr;

在你的- (void)viewDidLoad 方法中使用这一行

NSMutableArray*  arrayOfSentRequest=[self getAllRequestedShifts];

这将返回您的 CoreData 中所有对象的列表,其中 maxvalue 对象位于顶部。

检索此对象并使用属性 previousvalue 并与正在输入的值进行比较,并根据算法生成结果。

使用此代码

NSDateFormatter* dateF = [[NSDateFormatter alloc] init];
    [dateF setDateFormat:@"YYYY-MM-dd"];
  NSString *currentDate=[dateF stringFromDate:[NSDate date]];
    NSDate  * currentDateObj=[dateF dateFromString:currentDate];
    NSDate  * shiftDateFieldObj=[dateF dateobjectfromDB];
NSTimeInterval timeDifferenceBetweenDates = [shiftDateFieldObj timeIntervalSinceDate:currentDateObj];
 if (timeDifferenceBetweenDates>0.0)
  
      Enter the value to text field ;
  
  else
  
       show alert
  

希望这会有所帮助。

【讨论】:

谢谢,日期总是从当前作品开始(如果我们只想要用户访问应用程序的当前日期而不允许他修改日期呢?)......哦对于您解释的算法,您能否提供一些示例代码,说明如何在存储之前匹配一个值,这将非常有帮助 是的,将这段代码放入视图中确实加载了当视图将在该时间加载时日期选择器将显示当前日期 好的,所以我明白了如何编辑pickerview,因为你解释得很好。现在我仍然有点坚持价值总是比上一期大......我将编辑和更新整个帖子以获得更多可见性 上述过程不言自明 不好意思请问你添加的新代码应该在哪里调用呢?

以上是关于如何使用 CoreData 控制用户输入的主要内容,如果未能解决你的问题,请参考以下文章

我有登录页面如何使用 coredata 数据库对用户进行身份验证?

如何使用先前保存的 coreData 加载 TextEditor

如何在 segue 中从 CoreData 获取结果

如何根据用户输入使用新谓词重新运行@FetchRequest?

如何从 CoreData 实体获取结果

如何使用 coreData 过滤数据