在不违反设计原则的情况下,最好的方法是什么?
一个例子是在awakeFromInsert中获取该实体的所有先前实例,然后在找到某些内容时抛出异常(或任何想要做的事情)。但这种方式很糟糕,因为在模型对象中访问MOC肯定不好。
答案 0 :(得分:2)
您无法在Core Data对象图上实际强制执行单例模式。您可以尝试限制另一个实例的插入,但这很麻烦。
根据我的经验,您需要单个管理对象的信念表明设计不佳。单身人士用于控制程序内部。核心数据对象应该代表真实世界的对象,事件或条件和现实世界的对象,事件和条件不会显示为单例或类似的东西。
您可能正在尝试将控制器甚至视图逻辑放入数据模型中。您可能想重新考虑数据模型。
答案 1 :(得分:0)
我知道这是一个旧线程,但实际上我遇到了一个我希望保存实体的单个实例的实例。下面是一些示例代码,可以帮助其他人解决这个问题。
我的解决方案是清除实体(配置文件),将同一实体保存到Core Data,如果它有> = 1实例:
- (IBAction)saveProfile:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
if ([self.profile count] >= 1) {
NSFetchRequest * allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Profile" inManagedObjectContext:context]];
[allCars setIncludesPropertyValues:NO];
NSError * error = nil;
NSArray * cars = [context executeFetchRequest:allCars error:&error];
for (NSManagedObject * car in cars) {
[context deleteObject:car];
}
NSError *saveError = nil;
[context save:&saveError];
}
// Create a new managed object
NSManagedObject *profile = [NSEntityDescription insertNewObjectForEntityForName:@"Profile" inManagedObjectContext:context];
// Code to save information to persistent data store
}
正如预期的那样,在viewDidLoad中,我拉出实体的(配置文件)信息并填充视图,如果profile == 1 instance:
if ([self.profile count] == 1) {
// Code to pull information from persistent data store and populate the view
}