我正在制作一个应用程序,您需要使用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;
}
谢谢!
答案 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];