在Core Data中只有一个实体实例

时间:2014-01-12 16:38:08

标签: ios objective-c core-data nsmanagedobject

我正在制作一个应用程序,您需要使用4位数密码登录,但一次只能有一个密码。我试图将其保存到核心数据,但每当用户添加新密码时,它只是将其添加到长列表中。如何将实体限制为只有一个自身实例?

这是我的代码,以防万一它会有所帮助:

-(BOOL)savePassword:(NSString*)password{
    AppDelegate * appDelegate = [[AppDelegate alloc]init];
    NSManagedObjectContext * context = [appDelegate managedObjectContext];
    AppData * appData = (AppData*)[NSEntityDescription insertNewObjectForEntityForName:@"AppData" inManagedObjectContext:context];
    appData.password = password;
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"AppData" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil) {
        NSLog(@"There was an error:%@",error);
    }

    for (AppData * adata in fetchedObjects) {
        NSLog(@"Password:%@",adata.password);
    }
    return YES;
}

谢谢!

2 个答案:

答案 0 :(得分:4)

这里的正确方法是不将此数据放入Core Data 。如果您只有一个实例,则使用Core Data来解决问题毫无意义。使用Core Data对此没有任何好处。把它放在其他地方。代码解决方案忽视了这一点,因为即使它有效,也是一个糟糕的设计。

答案 1 :(得分:2)

你应该这样做,首先创建获取请求并执行获取。检查对象是否存在,更新数据。否则,如果不存在数据,则创建一个对象并保存。 如果存储密码的实体名称。 您的代码应如下所示

AppData * appData;
 NSManagedObjectContext * context = [appDelegate managedObjectContext];
 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
 NSEntityDescription *entity = [NSEntityDescription entityForName:@"AppData" inManagedObjectContext:context];
 [fetchRequest setEntity:entity];

 NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
 if(fetchObjects.count > 0){
      appData = [fetchObjects objectAtIndex:0];//assume there will be one object

      // and do reset of thing
 }
  else{

       appData = (AppData*)[NSEntityDescription insertNewObjectForEntityForName:@"AppData" inManagedObjectContext:context];

 }
 appData.password = password;
 // save moc here
 [context save:nil];